Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2010 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*!
     18 * =========================================================================== *
     19 *                                                                             *
     20 *                                                                             *
     21 * \file  phHciNfc_RFReader.c                                                  *
     22 * \brief HCI RF Reader Management Gate Routines.                              *
     23 *                                                                             *
     24 *                                                                             *
     25 * Project: NFC-FRI-1.1                                                        *
     26 *                                                                             *
     27 * $Date: Wed Apr 21 12:21:15 2010 $                                           *
     28 * $Author: ing07385 $                                                         *
     29 * $Revision: 1.53 $                                                            *
     30 * $Aliases: NFC_FRI1.1_WK1007_R33_6 $                                                                *
     31 *                                                                             *
     32 * =========================================================================== *
     33 */
     34 
     35 /*
     36 ***************************** Header File Inclusion ****************************
     37 */
     38 #include <phNfcConfig.h>
     39 #include <phNfcCompId.h>
     40 #include <phHciNfc_Pipe.h>
     41 #include <phHciNfc_RFReader.h>
     42 #include <phHciNfc_RFReaderA.h>
     43 #ifdef TYPE_B
     44 #include <phHciNfc_RFReaderB.h>
     45 #endif
     46 #ifdef ENABLE_P2P
     47 #include <phHciNfc_NfcIPMgmt.h>
     48 #endif
     49 #ifdef TYPE_FELICA
     50 #include <phHciNfc_Felica.h>
     51 #endif
     52 #ifdef TYPE_JEWEL
     53 #include <phHciNfc_Jewel.h>
     54 #endif
     55 #ifdef TYPE_ISO15693
     56 #include <phHciNfc_ISO15693.h>
     57 #endif /* #ifdef    TYPE_ISO15693 */
     58 #include <phOsalNfc.h>
     59 
     60 /*
     61 ****************************** Macro Definitions *******************************
     62 */
     63 
     64 #define NFCIP_ACTIVATE_DELAY       0x05U
     65 
     66 uint8_t nxp_nfc_isoxchg_timeout = NXP_ISO_XCHG_TIMEOUT;
     67 /*
     68 *************************** Structure and Enumeration ***************************
     69 */
     70 
     71 
     72 /** \defgroup grp_hci_nfc HCI Reader RF Management Component
     73  *
     74  *
     75  */
     76 
     77 
     78 typedef enum phHciNfc_ReaderMgmt_Seq{
     79     READERA_PIPE_OPEN       = 0x00U,
     80     READERB_PIPE_OPEN,
     81     FELICA_PROP_PIPE_OPEN,
     82     JEWEL_PROP_PIPE_OPEN,
     83     ISO15693_PROP_PIPE_OPEN,
     84     NFCIP1_INITIATOR_PIPE_OPEN,
     85     NFCIP1_INITIATOR_MODE_CONFIG,
     86     NFCIP1_INITIATOR_PSL1_CONFIG,
     87     NFCIP1_INITIATOR_PSL2_CONFIG,
     88     READERA_DISABLE_AUTO_ACTIVATE,
     89 
     90 
     91     READERA_PIPE_CLOSE,
     92     READERB_PIPE_CLOSE,
     93     FELICA_PROP_PIPE_CLOSE,
     94     JEWEL_PROP_PIPE_CLOSE,
     95     ISO15693_PROP_PIPE_CLOSE,
     96     NFCIP1_INITIATOR_PIPE_CLOSE,
     97     END_READER_SEQUENCE
     98 } phHciNfc_ReaderMgmt_Seq_t;
     99 
    100 typedef struct phHciNfc_ReaderMgmt_Info{
    101     phHciNfc_ReaderMgmt_Seq_t   rf_gate_cur_seq;
    102     phHciNfc_ReaderMgmt_Seq_t   rf_gate_next_seq;
    103 } phHciNfc_ReaderMgmt_Info_t;
    104 
    105 
    106 /*
    107 *************************** Static Function Declaration **************************
    108 */
    109 static
    110 NFCSTATUS
    111 phHciNfc_ReaderMgmt_End_Discovery(
    112                                 phHciNfc_sContext_t     *psHciContext,
    113                                 void                    *pHwRef,
    114                                 uint8_t                 reader_pipe_id
    115                              );
    116 
    117 static
    118 NFCSTATUS
    119 phHciNfc_ReaderMgmt_Initiate_Discovery(
    120                                 phHciNfc_sContext_t     *psHciContext,
    121                                 void                    *pHwRef,
    122                                 uint8_t                 reader_pipe_id
    123                              );
    124 
    125 /*
    126 *************************** Function Definitions ***************************
    127 */
    128 
    129 #ifdef READER_INIT
    130 /*!
    131  * \brief Allocates the resources of RF Reader Managment Gate.
    132  *
    133  * This function Allocates the resources of the RF Reader Management
    134  * gate Information Structure.
    135  *
    136  */
    137 
    138 NFCSTATUS
    139 phHciNfc_ReaderMgmt_Init_Resources(
    140                                 phHciNfc_sContext_t     *psHciContext
    141                              )
    142 {
    143     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    144     phHciNfc_ReaderMgmt_Info_t  *p_reader_mgmt_info=NULL;
    145     if( NULL == psHciContext )
    146     {
    147         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    148     }
    149     else
    150     {
    151         if( ( NULL == psHciContext->p_reader_mgmt_info )
    152             && (phHciNfc_Allocate_Resource((void **)(&p_reader_mgmt_info),
    153                     sizeof(phHciNfc_ReaderMgmt_Info_t))== NFCSTATUS_SUCCESS)
    154         )
    155         {
    156             psHciContext->p_reader_mgmt_info = p_reader_mgmt_info;
    157             p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN;
    158             p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE;
    159         }
    160         else
    161         {
    162             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
    163         }
    164     }
    165     return status;
    166 }
    167 
    168 #endif
    169 
    170 /*!
    171  * \brief Updates the Sequence of RF Reader Managment Gate.
    172  *
    173  * This function Resets/Updates the sequence of the RF Reader Management
    174  * gate.
    175  *
    176  */
    177 
    178 NFCSTATUS
    179 phHciNfc_ReaderMgmt_Update_Sequence(
    180                                 phHciNfc_sContext_t     *psHciContext,
    181                                 phHciNfc_eSeqType_t     reader_seq
    182                              )
    183 {
    184     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    185     phHciNfc_ReaderMgmt_Info_t  *p_reader_mgmt_info = NULL;
    186     if( NULL == psHciContext )
    187     {
    188         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    189     }
    190     else
    191     {
    192         if( NULL == psHciContext->p_reader_mgmt_info )
    193         {
    194             status = PHNFCSTVAL(CID_NFC_HCI,
    195                         NFCSTATUS_INVALID_HCI_INFORMATION);
    196         }
    197         else
    198         {
    199             p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
    200                                 psHciContext->p_reader_mgmt_info ;
    201             switch(reader_seq)
    202             {
    203                 case RESET_SEQ:
    204                 case INIT_SEQ:
    205                 {
    206                     p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN;
    207                     p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE;
    208                     break;
    209                 }
    210                 case UPDATE_SEQ:
    211                 {
    212                     p_reader_mgmt_info->rf_gate_cur_seq =
    213                                             p_reader_mgmt_info->rf_gate_next_seq;
    214                     break;
    215                 }
    216                 case INFO_SEQ:
    217                 {
    218                     status = phHciNfc_ReaderA_Update_Info(psHciContext,
    219                                             HCI_READER_A_INFO_SEQ, NULL);
    220 #if defined( TYPE_B )
    221                     status = phHciNfc_ReaderB_Update_Info(psHciContext,
    222                                             HCI_READER_B_INFO_SEQ, NULL);
    223 #endif /* end of #if defined(TYPE_B) */
    224 #if defined( TYPE_FELICA )
    225                     status = phHciNfc_Felica_Update_Info(psHciContext,
    226                                             HCI_FELICA_INFO_SEQ, NULL);
    227 #endif /* end of #if defined(TYPE_FELICA) */
    228 #if defined( TYPE_JEWEL )
    229                     status = phHciNfc_Jewel_Update_Info(psHciContext,
    230                                             HCI_JEWEL_INFO_SEQ, NULL);
    231 #endif /* end of #if defined(TYPE_JEWEL) */
    232 #if defined( TYPE_ISO15693 )
    233                     status = phHciNfc_ISO15693_Update_Info(psHciContext,
    234                                             HCI_ISO_15693_INFO_SEQ, NULL);
    235 #endif /* end of #if defined(TYPE_ISO15693) */
    236                     break;
    237                 }
    238                 case REL_SEQ:
    239                 {
    240                     p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_CLOSE;
    241                     p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE;
    242                     break;
    243                 }
    244                 default:
    245                 {
    246                     break;
    247                 }
    248             }
    249         }
    250     }
    251 
    252     return status;
    253 
    254 }
    255 
    256 
    257 /*!
    258  * \brief Initialisation of RF Reader Managment Gate.
    259  *
    260  * This function initialses the RF Reader Management gate and
    261  * populates the Reader Management Information Structure
    262  *
    263  */
    264 
    265 NFCSTATUS
    266 phHciNfc_ReaderMgmt_Initialise(
    267                                 phHciNfc_sContext_t     *psHciContext,
    268                                 void                    *pHwRef
    269                          )
    270 {
    271     NFCSTATUS                       status = NFCSTATUS_SUCCESS;
    272     phHciNfc_Pipe_Info_t            *p_pipe_info = NULL;
    273     phHciNfc_ReaderMgmt_Info_t      *p_reader_mgmt_info=NULL;
    274 
    275     if( NULL == psHciContext )
    276     {
    277         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    278     }
    279     else
    280     {
    281 
    282         if( ( NULL == psHciContext->p_reader_mgmt_info )
    283             && (phHciNfc_Allocate_Resource((void **)(&p_reader_mgmt_info),
    284                     sizeof(phHciNfc_ReaderMgmt_Info_t))== NFCSTATUS_SUCCESS)
    285         )
    286         {
    287             psHciContext->p_reader_mgmt_info = p_reader_mgmt_info;
    288             p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN;
    289             p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE;
    290         }
    291         else
    292         {
    293             p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
    294                                 psHciContext->p_reader_mgmt_info ;
    295         }
    296 
    297         if( NULL == psHciContext->p_reader_mgmt_info )
    298         {
    299             status = PHNFCSTVAL(CID_NFC_HCI,
    300                                 NFCSTATUS_INSUFFICIENT_RESOURCES);
    301         }
    302 #ifdef ESTABLISH_SESSION
    303         else if( hciMode_Session == psHciContext->hci_mode )
    304         {
    305             status = NFCSTATUS_SUCCESS;
    306         }
    307 #endif
    308         else
    309         {
    310             switch(p_reader_mgmt_info->rf_gate_cur_seq )
    311             {
    312                 /* Reader A pipe open sequence */
    313                 case READERA_PIPE_OPEN:
    314                 {
    315                     p_pipe_info = ((phHciNfc_ReaderA_Info_t *)
    316                             psHciContext->p_reader_a_info)->p_pipe_info;
    317                     if(NULL == p_pipe_info )
    318                     {
    319                         status = PHNFCSTVAL(CID_NFC_HCI,
    320                                         NFCSTATUS_INVALID_HCI_SEQUENCE);
    321                     }
    322                     else
    323                     {
    324                         status = phHciNfc_Open_Pipe( psHciContext,
    325                                                         pHwRef, p_pipe_info );
    326                         if(status == NFCSTATUS_SUCCESS)
    327                         {
    328                             uint8_t rdr_enable = TRUE;
    329                             status = phHciNfc_ReaderA_Update_Info(
    330                                     psHciContext, HCI_READER_A_ENABLE,
    331                                                             &rdr_enable);
    332 #if defined( TYPE_B )  && defined ( ENABLE_AUTO_ACTIVATE )
    333                             p_reader_mgmt_info->rf_gate_next_seq =
    334                                                     READERB_PIPE_OPEN;
    335                             status = NFCSTATUS_PENDING;
    336 /* end of #ifdef TYPE_B */
    337 #elif !defined( ENABLE_AUTO_ACTIVATE )
    338                             p_reader_mgmt_info->rf_gate_next_seq =
    339                                                         READERA_DISABLE_AUTO_ACTIVATE;
    340                             status = NFCSTATUS_PENDING;
    341 /* #ifdef ENABLE_AUTO_ACTIVATE */
    342 #elif defined( ENABLE_P2P )
    343                             p_reader_mgmt_info->rf_gate_next_seq =
    344                                                     NFCIP1_INITIATOR_PIPE_OPEN;
    345                             status = NFCSTATUS_PENDING;
    346 /* #ifdef ENABLE_P2P */
    347 #else
    348                             p_reader_mgmt_info->rf_gate_next_seq =
    349                                                 END_READER_SEQUENCE;
    350                             /* status = NFCSTATUS_PENDING; */
    351 #endif
    352                         }
    353                     }
    354                     break;
    355                 }
    356                 /* Reader A Auto Activate Disable */
    357                 case READERA_DISABLE_AUTO_ACTIVATE:
    358                 {
    359                     uint8_t     activate_enable = FALSE;
    360                     p_pipe_info = ((phHciNfc_ReaderA_Info_t *)
    361                             psHciContext->p_reader_a_info)->p_pipe_info;
    362                     if(NULL == p_pipe_info )
    363                     {
    364                         status = PHNFCSTVAL(CID_NFC_HCI,
    365                                         NFCSTATUS_INVALID_HCI_SEQUENCE);
    366                     }
    367                     else
    368                     {
    369 
    370                         status = phHciNfc_ReaderA_Auto_Activate( psHciContext,
    371                                                         pHwRef, activate_enable );
    372                         if(status == NFCSTATUS_SUCCESS)
    373                         {
    374 #if defined (TYPE_B)
    375                             p_reader_mgmt_info->rf_gate_next_seq =
    376                                                     READERB_PIPE_OPEN;
    377                             status = NFCSTATUS_PENDING;
    378 /* end of #ifdef TYPE_B */
    379 #elif defined(TYPE_FELICA)
    380                             p_reader_mgmt_info->rf_gate_next_seq =
    381                                                         FELICA_PROP_PIPE_OPEN;
    382                             status = NFCSTATUS_PENDING;
    383 /* end of #elif defined(TYPE_FELICA) */
    384 #elif defined(TYPE_JEWEL)
    385                             p_reader_mgmt_info->rf_gate_next_seq =
    386                                                         JEWEL_PROP_PIPE_OPEN;
    387                             status = NFCSTATUS_PENDING;
    388 /* end of #elif defined(TYPE_JEWEL) */
    389 #elif defined (TYPE_ISO15693)
    390                             p_reader_mgmt_info->rf_gate_next_seq =
    391                                                     ISO15693_PROP_PIPE_OPEN;
    392                             status = NFCSTATUS_PENDING;
    393 /* end of #elif defined(TYPE_ISO15693) */
    394 #elif defined(ENABLE_P2P)
    395                             p_reader_mgmt_info->rf_gate_next_seq =
    396                                                     NFCIP1_INITIATOR_PIPE_OPEN;
    397                             status = NFCSTATUS_PENDING;
    398 /* end of #ifdef ENABLE_P2P */
    399 #else
    400                             p_reader_mgmt_info->rf_gate_next_seq =
    401                                                             END_READER_SEQUENCE;
    402                             /* status = NFCSTATUS_PENDING; */
    403 #endif /* #if !defined(ENABLE_P2P) && !defined(TYPE_B)*/
    404                         }
    405                     }
    406                     break;
    407                 }
    408 #ifdef TYPE_B
    409                 /* Reader B pipe open sequence */
    410                 case READERB_PIPE_OPEN:
    411                 {
    412                     p_pipe_info = ((phHciNfc_ReaderB_Info_t *)
    413                             psHciContext->p_reader_b_info)->p_pipe_info;
    414                     if(NULL == p_pipe_info )
    415                     {
    416                         status = PHNFCSTVAL(CID_NFC_HCI,
    417                                         NFCSTATUS_INVALID_HCI_SEQUENCE);
    418                     }
    419                     else
    420                     {
    421                         status = phHciNfc_Open_Pipe( psHciContext,
    422                                                         pHwRef, p_pipe_info );
    423                         if(status == NFCSTATUS_SUCCESS)
    424                         {
    425 #if defined(TYPE_FELICA)
    426                             p_reader_mgmt_info->rf_gate_next_seq =
    427                                                         FELICA_PROP_PIPE_OPEN;
    428                             status = NFCSTATUS_PENDING;
    429 /* end of #ifdef TYPE_FELICA */
    430 #elif defined(TYPE_JEWEL)
    431                             p_reader_mgmt_info->rf_gate_next_seq =
    432                                                         JEWEL_PROP_PIPE_OPEN;
    433                             status = NFCSTATUS_PENDING;
    434 /* end of #elif defined(TYPE_JEWEL) */
    435 #elif defined (TYPE_ISO15693)
    436                             p_reader_mgmt_info->rf_gate_next_seq =
    437                                                     ISO15693_PROP_PIPE_OPEN;
    438                             status = NFCSTATUS_PENDING;
    439 /* end of #elif defined(TYPE_ISO15693) */
    440 #elif defined(ENABLE_P2P)
    441                             p_reader_mgmt_info->rf_gate_next_seq =
    442                                                     NFCIP1_INITIATOR_PIPE_OPEN;
    443                             status = NFCSTATUS_PENDING;
    444 /* end of #ifdef ENABLE_P2P */
    445 #else
    446                             p_reader_mgmt_info->rf_gate_next_seq =
    447                                                             END_READER_SEQUENCE;
    448                             /* status = NFCSTATUS_PENDING; */
    449 #endif /* #if !defined(ENABLE_P2P) && !defined(TYPE_FELICA)*/
    450                         }
    451                     }
    452                     break;
    453                 }
    454 #endif /* #ifdef TYPE_B */
    455 #ifdef TYPE_FELICA
    456                 /* Felica Reader pipe open sequence */
    457                 case FELICA_PROP_PIPE_OPEN:
    458                 {
    459                     p_pipe_info = ((phHciNfc_Felica_Info_t *)
    460                             psHciContext->p_felica_info)->p_pipe_info;
    461                     if(NULL == p_pipe_info )
    462                     {
    463                         status = PHNFCSTVAL(CID_NFC_HCI,
    464                                         NFCSTATUS_INVALID_HCI_SEQUENCE);
    465                     }
    466                     else
    467                     {
    468                         status = phHciNfc_Open_Pipe( psHciContext,
    469                                                         pHwRef, p_pipe_info );
    470                         if(status == NFCSTATUS_SUCCESS)
    471                         {
    472 #if defined(TYPE_JEWEL)
    473                             p_reader_mgmt_info->rf_gate_next_seq =
    474                                                         JEWEL_PROP_PIPE_OPEN;
    475                             status = NFCSTATUS_PENDING;
    476 /* end of #if defined(TYPE_JEWEL) */
    477 #elif defined (TYPE_ISO15693)
    478                             p_reader_mgmt_info->rf_gate_next_seq =
    479                                                     ISO15693_PROP_PIPE_OPEN;
    480                             status = NFCSTATUS_PENDING;
    481 /* end of #elif defined(TYPE_ISO15693) */
    482 #elif defined(ENABLE_P2P)
    483                             p_reader_mgmt_info->rf_gate_next_seq =
    484                                                     NFCIP1_INITIATOR_PIPE_OPEN;
    485                             status = NFCSTATUS_PENDING;
    486  /* end of #ifdef ENABLE_P2P */
    487 #else
    488                             p_reader_mgmt_info->rf_gate_next_seq =
    489                                                             END_READER_SEQUENCE;
    490                             /* status = NFCSTATUS_PENDING; */
    491 #endif /* #if !defined(ENABLE_P2P) */
    492                         }
    493                     }
    494                     break;
    495                 }
    496 #endif
    497 #ifdef TYPE_JEWEL
    498                 /* Jewel Reader pipe open sequence */
    499                 case JEWEL_PROP_PIPE_OPEN:
    500                 {
    501                     p_pipe_info = ((phHciNfc_Jewel_Info_t *)
    502                             psHciContext->p_jewel_info)->p_pipe_info;
    503                     if(NULL == p_pipe_info )
    504                     {
    505                         status = PHNFCSTVAL(CID_NFC_HCI,
    506                                         NFCSTATUS_INVALID_HCI_SEQUENCE);
    507                     }
    508                     else
    509                     {
    510                         status = phHciNfc_Open_Pipe( psHciContext,
    511                                                         pHwRef, p_pipe_info );
    512                         if(status == NFCSTATUS_SUCCESS)
    513                         {
    514 #if defined (TYPE_ISO15693)
    515                             p_reader_mgmt_info->rf_gate_next_seq =
    516                                                     ISO15693_PROP_PIPE_OPEN;
    517                             status = NFCSTATUS_PENDING;
    518 /* end of #if defined(TYPE_ISO15693) */
    519 #elif defined (ENABLE_P2P)
    520                             p_reader_mgmt_info->rf_gate_next_seq =
    521                                                     NFCIP1_INITIATOR_PIPE_OPEN;
    522                             status = NFCSTATUS_PENDING;
    523  /* end of #ifdef ENABLE_P2P */
    524 #else
    525                             p_reader_mgmt_info->rf_gate_next_seq =
    526                                                             END_READER_SEQUENCE;
    527                             /* status = NFCSTATUS_PENDING; */
    528 #endif /* #if !defined(ENABLE_P2P) */
    529                         }
    530                     }
    531                     break;
    532                 }
    533 #endif
    534 
    535 #ifdef TYPE_ISO15693
    536                 /* ISO15693 Reader pipe open sequence */
    537                 case ISO15693_PROP_PIPE_OPEN:
    538                 {
    539                     p_pipe_info = ((phHciNfc_ISO15693_Info_t *)
    540                         psHciContext->p_iso_15693_info)->ps_15693_pipe_info;
    541                     if(NULL == p_pipe_info )
    542                     {
    543                         status = PHNFCSTVAL(CID_NFC_HCI,
    544                                         NFCSTATUS_INVALID_HCI_SEQUENCE);
    545                     }
    546                     else
    547                     {
    548                         status = phHciNfc_Open_Pipe( psHciContext,
    549                                                         pHwRef, p_pipe_info );
    550                         if(status == NFCSTATUS_SUCCESS)
    551                         {
    552 #ifdef ENABLE_P2P
    553                             p_reader_mgmt_info->rf_gate_next_seq =
    554                                                     NFCIP1_INITIATOR_PIPE_OPEN;
    555                             status = NFCSTATUS_PENDING;
    556  /* end of #ifdef ENABLE_P2P */
    557 #else
    558                             p_reader_mgmt_info->rf_gate_next_seq =
    559                                                             END_READER_SEQUENCE;
    560                             /* status = NFCSTATUS_PENDING; */
    561 #endif /* #if !defined(ENABLE_P2P) */
    562                         }
    563                     }
    564                     break;
    565                 }
    566 
    567 #endif
    568 
    569 #ifdef ENABLE_P2P
    570                 /* NFC-IP1 Initiator pipe open sequence */
    571                 case NFCIP1_INITIATOR_PIPE_OPEN:
    572                 {
    573                     p_pipe_info =
    574                         ((phHciNfc_NfcIP_Info_t *)psHciContext->
    575                                     p_nfcip_info)->p_init_pipe_info;
    576                     if(NULL == p_pipe_info )
    577                     {
    578                         status = PHNFCSTVAL(CID_NFC_HCI,
    579                                         NFCSTATUS_INVALID_HCI_SEQUENCE);
    580                     }
    581                     else
    582                     {
    583                         status = phHciNfc_Open_Pipe( psHciContext,
    584                                                         pHwRef, p_pipe_info );
    585                         if(status == NFCSTATUS_SUCCESS)
    586                         {
    587                             p_reader_mgmt_info->rf_gate_next_seq =
    588                                                 NFCIP1_INITIATOR_MODE_CONFIG;
    589                             status = NFCSTATUS_PENDING;
    590                         }
    591                     }
    592                     break;
    593                 }
    594                 case NFCIP1_INITIATOR_MODE_CONFIG:
    595                 {
    596                     uint8_t mode = DEFAULT_NFCIP_INITIATOR_MODE_SUPPORT;
    597                     status = phHciNfc_NfcIP_SetMode( psHciContext, pHwRef,
    598                                                 NFCIP_INITIATOR, mode);
    599                     if(status == NFCSTATUS_PENDING )
    600                     {
    601                         p_reader_mgmt_info->rf_gate_next_seq =
    602                                             NFCIP1_INITIATOR_PSL1_CONFIG;
    603                         /* status = NFCSTATUS_SUCCESS; */
    604                     }
    605                     break;
    606                 }
    607                 case NFCIP1_INITIATOR_PSL1_CONFIG:
    608                 {
    609                     uint8_t psl_config = NXP_NFCIP_PSL_BRS_DEFAULT;
    610                     status = phHciNfc_NfcIP_SetPSL1( psHciContext, pHwRef,
    611                                                 psl_config);
    612                     if(status == NFCSTATUS_PENDING )
    613                     {
    614                         p_reader_mgmt_info->rf_gate_next_seq =
    615                                                         END_READER_SEQUENCE;
    616                         status = NFCSTATUS_SUCCESS;
    617                     }
    618                     break;
    619                 }
    620 #endif
    621                 default:
    622                 {
    623                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
    624                     break;
    625                 }
    626 
    627             }/* End of the Sequence Switch */
    628 
    629         }/* End of the Reader Info Memory Check */
    630 
    631     } /* End of Null Context Check */
    632 
    633     return status;
    634 }
    635 
    636 
    637 /*!
    638  * \brief Initiate the Discovery for the RF Reader .
    639  *
    640  * This function starts the Polling Loop and initiates the discovery
    641  * of the Target.
    642  *
    643  */
    644 static
    645 NFCSTATUS
    646 phHciNfc_ReaderMgmt_Initiate_Discovery(
    647                                 phHciNfc_sContext_t     *psHciContext,
    648                                 void                    *pHwRef,
    649                                 uint8_t                 reader_pipe_id
    650                              )
    651 {
    652     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    653 
    654     if( ( NULL == psHciContext )
    655         || ( NULL == pHwRef )
    656         || ( HCI_UNKNOWN_PIPE_ID == reader_pipe_id)
    657         )
    658     {
    659         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    660     }
    661     else
    662     {
    663 
    664         status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef,
    665                     reader_pipe_id,(uint8_t) EVT_READER_REQUESTED );
    666         status = ( (status == NFCSTATUS_PENDING)?
    667                                 NFCSTATUS_SUCCESS : status);
    668     }
    669     return status;
    670 }
    671 
    672 
    673 /*!
    674  * \brief End the Discovery of the RF Reader .
    675  *
    676  * This function stops the Polling Loop and ends the discovery
    677  * of the Target.
    678  *
    679  */
    680 static
    681 NFCSTATUS
    682 phHciNfc_ReaderMgmt_End_Discovery(
    683                                 phHciNfc_sContext_t     *psHciContext,
    684                                 void                    *pHwRef,
    685                                 uint8_t                 reader_pipe_id
    686                              )
    687 {
    688     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    689 
    690     if( ( NULL == psHciContext )
    691         || ( NULL == pHwRef )
    692         || ( HCI_UNKNOWN_PIPE_ID == reader_pipe_id)
    693         )
    694     {
    695         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    696     }
    697     else
    698     {
    699 
    700         status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef,
    701                     reader_pipe_id,(uint8_t) EVT_END_OPERATION );
    702         status = ( (status == NFCSTATUS_PENDING)?
    703                                 NFCSTATUS_SUCCESS : status);
    704     }
    705     return status;
    706 }
    707 
    708 
    709 /*!
    710  * \brief Enable the Discovery of RF Reader Managment Gate.
    711  *
    712  * This function Enable the discovery of the RF Reader Management
    713  * gate.
    714  *
    715  */
    716 
    717 
    718 NFCSTATUS
    719 phHciNfc_ReaderMgmt_Enable_Discovery(
    720                                 phHciNfc_sContext_t     *psHciContext,
    721                                 void                    *pHwRef
    722                              )
    723 {
    724     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    725     phHciNfc_ReaderMgmt_Info_t  *p_reader_mgmt_info=NULL;
    726     uint8_t                     reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
    727     /* phHal_sADD_Cfg_t    *p_poll_config = (phHal_sADD_Cfg_t * )
    728                                             psHciContext->p_config_params; */
    729     PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info);
    730     if( NULL != psHciContext->p_reader_mgmt_info )
    731     {
    732         uint8_t rdr_enable = FALSE;
    733         p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
    734                             psHciContext->p_reader_mgmt_info ;
    735 #ifdef TYPE_B
    736         if ( (NULL != psHciContext->p_reader_b_info )
    737              /*   && (FALSE == rdr_enable) */
    738         )
    739         {
    740             /* Get the Reader B Pipe ID */
    741             status = phHciNfc_ReaderB_Get_PipeID
    742                                     (psHciContext, &reader_pipe_id);
    743 
    744             if( NFCSTATUS_SUCCESS == status )
    745             {
    746                 rdr_enable = (uint8_t)TRUE;
    747                 /* rdr_enable = (uint8_t)
    748                         p_poll_config->PollDevInfo.PollCfgInfo.EnableIso14443B; */
    749                 status =    phHciNfc_ReaderB_Update_Info(psHciContext,
    750                                         HCI_RDR_ENABLE_TYPE, &rdr_enable);
    751             }
    752         }
    753 #endif
    754 #ifdef TYPE_FELICA
    755         if ( (NULL != psHciContext->p_felica_info )
    756                /* && (FALSE == rdr_enable) */
    757         )
    758         {
    759             /* Get the Reader F Pipe ID */
    760             status = phHciNfc_Felica_Get_PipeID
    761                                     (psHciContext, &reader_pipe_id);
    762 
    763             if( NFCSTATUS_SUCCESS == status )
    764             {
    765                 rdr_enable = (uint8_t)TRUE;
    766                /* rdr_enable = (uint8_t)
    767                     ( p_poll_config->PollDevInfo.PollCfgInfo.EnableFelica212
    768                         || p_poll_config->PollDevInfo.PollCfgInfo.EnableFelica424 ); */
    769                 status =    phHciNfc_Felica_Update_Info(psHciContext,
    770                                         HCI_RDR_ENABLE_TYPE, &rdr_enable);
    771             }
    772         }
    773 #endif
    774 #ifdef TYPE_JEWEL
    775         if ( (NULL != psHciContext->p_jewel_info )
    776                /* && (FALSE == rdr_enable) */
    777         )
    778         {
    779             /* Get the Reader F Pipe ID */
    780             status = phHciNfc_Jewel_Get_PipeID
    781                                     (psHciContext, &reader_pipe_id);
    782 
    783             if( NFCSTATUS_SUCCESS == status )
    784             {
    785                 rdr_enable = (uint8_t)TRUE;
    786                 status =    phHciNfc_Jewel_Update_Info(psHciContext,
    787                                         HCI_RDR_ENABLE_TYPE, &rdr_enable);
    788             }
    789         }
    790 #endif /* #ifdef TYPE_JEWEL */
    791 #if defined(TYPE_ISO15693)
    792         if ( (NULL != psHciContext->p_iso_15693_info )
    793                /* && (FALSE == rdr_enable) */
    794         )
    795         {
    796             /* Get the Reader F Pipe ID */
    797             status = phHciNfc_ISO15693_Get_PipeID
    798                                     (psHciContext, &reader_pipe_id);
    799 
    800             if( NFCSTATUS_SUCCESS == status )
    801             {
    802                 rdr_enable = (uint8_t)TRUE;
    803                 status =    phHciNfc_ISO15693_Update_Info(psHciContext,
    804                                         HCI_RDR_ENABLE_TYPE, &rdr_enable);
    805             }
    806         }
    807 
    808 /* end of #elif defined(TYPE_ISO15693) */
    809 #endif
    810 
    811         if(NULL != psHciContext->p_reader_a_info)
    812         {
    813             /* Get the Reader A Pipe ID */
    814             status = phHciNfc_ReaderA_Get_PipeID
    815                                     (psHciContext, &reader_pipe_id);
    816 
    817             if( NFCSTATUS_SUCCESS == status )
    818             {
    819                 rdr_enable = (uint8_t)TRUE;
    820                 status =    phHciNfc_ReaderA_Update_Info(psHciContext,
    821                                         HCI_RDR_ENABLE_TYPE, &rdr_enable);
    822             }
    823 
    824         }
    825         if( ( NFCSTATUS_SUCCESS == status )
    826             && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
    827           )
    828         {
    829             status = phHciNfc_ReaderMgmt_Initiate_Discovery( psHciContext,
    830                          pHwRef, reader_pipe_id);
    831         }
    832 
    833     }/* End of the Reader Info Memory Check */
    834 
    835     return status;
    836 }
    837 
    838 /*!
    839  * \brief Disable the Discovery of RF Reader Managment Gate.
    840  *
    841  * This function Disable the discovery of the RF Reader Management
    842  * gate.
    843  *
    844  */
    845 
    846 NFCSTATUS
    847 phHciNfc_ReaderMgmt_Disable_Discovery(
    848                                 phHciNfc_sContext_t     *psHciContext,
    849                                 void                    *pHwRef
    850                              )
    851 {
    852     NFCSTATUS                   status = NFCSTATUS_FAILED;
    853     phHciNfc_ReaderMgmt_Info_t  *p_reader_mgmt_info=NULL;
    854     uint8_t                     reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
    855     /* phHal_sADD_Cfg_t         *p_poll_config = (phHal_sADD_Cfg_t * )
    856                                             psHciContext->p_config_params; */
    857     PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info);
    858     if( NULL != psHciContext->p_reader_mgmt_info )
    859     {
    860         p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
    861                             psHciContext->p_reader_mgmt_info ;
    862         if(NULL != psHciContext->p_reader_a_info)
    863         {
    864             /* Get the Reader A Pipe ID */
    865             status = phHciNfc_ReaderA_Get_PipeID
    866                                     (psHciContext, &reader_pipe_id);
    867 #if 0
    868             if( NFCSTATUS_SUCCESS == status )
    869             {
    870                 uint8_t rdr_enable = (uint8_t) FALSE;
    871                 status =    phHciNfc_ReaderA_Update_Info(psHciContext,
    872                                         HCI_RDR_ENABLE_TYPE, &rdr_enable);
    873             }
    874 #endif
    875 
    876         }
    877 #ifdef TYPE_B
    878         else if((NULL != psHciContext->p_reader_b_info )
    879             /* && (NFCSTATUS_SUCCESS != status) */
    880             )
    881         {
    882             /* Get the Reader B Pipe ID */
    883             status = phHciNfc_ReaderB_Get_PipeID
    884                                     (psHciContext, &reader_pipe_id);
    885         }
    886 #endif
    887 #ifdef TYPE_FELICA
    888         else if((NULL != psHciContext->p_felica_info )
    889             /* && (NFCSTATUS_SUCCESS != status) */
    890             )
    891         {
    892             /* Get the Reader B Pipe ID */
    893             status = phHciNfc_Felica_Get_PipeID
    894                                     (psHciContext, &reader_pipe_id);
    895         }
    896 #endif
    897 #ifdef TYPE_JEWEL
    898         else if((NULL != psHciContext->p_jewel_info )
    899             /* && (NFCSTATUS_SUCCESS != status) */
    900             )
    901         {
    902             /* Get the Reader B Pipe ID */
    903             status = phHciNfc_Jewel_Get_PipeID
    904                                     (psHciContext, &reader_pipe_id);
    905         }
    906 #endif /* #ifdef TYPE_JEWEL */
    907 #ifdef  TYPE_ISO15693
    908         else if((NULL != psHciContext->p_iso_15693_info )
    909             /* && (NFCSTATUS_SUCCESS != status) */
    910             )
    911         {
    912             /* Get the Reader B Pipe ID */
    913             status = phHciNfc_ISO15693_Get_PipeID
    914                                     (psHciContext, &reader_pipe_id);
    915         }
    916 #endif /* #ifdef    TYPE_ISO15693 */
    917 
    918         else
    919         {
    920             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED);
    921         }
    922 
    923         if( (NFCSTATUS_SUCCESS == status)
    924             && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
    925             )
    926         {
    927             status = phHciNfc_ReaderMgmt_End_Discovery( psHciContext,
    928                          pHwRef, reader_pipe_id);
    929         }
    930 
    931     }/* End of the Reader Info Memory Check */
    932 
    933     return status;
    934 }
    935 
    936 
    937 
    938 
    939 /*!
    940 * \brief Updates the Sequence of RF Reader Managment Gate.
    941 *
    942 * This function Resets/Updates the sequence of the RF Reader Management
    943 * gate.
    944 *
    945 */
    946 
    947 NFCSTATUS
    948 phHciNfc_ReaderMgmt_Info_Sequence(
    949                                    phHciNfc_sContext_t      *psHciContext,
    950                                    void                     *pHwRef
    951                                )
    952 {
    953 #if defined(NXP_NFCIP_ACTIVATE_DELAY)
    954     static uint8_t              nfc_atr_retry = 0;
    955 #endif
    956     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    957     phHciNfc_ReaderMgmt_Info_t  *p_reader_mgmt_info=NULL;
    958 #if 0
    959     uint8_t                     reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
    960     phHal_eRemDevType_t         target_type = phHal_eUnknown_DevType;
    961 #endif
    962 
    963 
    964     PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info);
    965     if( NULL == psHciContext )
    966     {
    967         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    968     }
    969     else
    970     {
    971         if( NULL != psHciContext->p_reader_mgmt_info )
    972         {
    973             p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
    974                 psHciContext->p_reader_mgmt_info ;
    975             switch( psHciContext->host_rf_type )
    976             {
    977 
    978                 case phHal_eISO14443_A_PCD:
    979                 {
    980                     /* If the Target Info is updated then the Target
    981                      * is connected.
    982                      */
    983                     if(NULL == psHciContext->p_target_info)
    984                     {
    985 #if defined(NXP_NFCIP_ACTIVATE_DELAY)
    986                         nfc_atr_retry = 0;
    987 #endif
    988                         status = phHciNfc_ReaderA_Info_Sequence(
    989                                                     psHciContext, pHwRef );
    990                     }
    991                     else
    992                     {
    993                             status = phHciNfc_ReaderA_App_Data(
    994                                                 psHciContext, pHwRef );
    995                             status = ((NFCSTATUS_PENDING == status )?
    996                                         NFCSTATUS_SUCCESS : status);
    997                     }
    998                     break;
    999                 }
   1000 #ifdef ENABLE_P2P
   1001                 case phHal_eNfcIP1_Initiator:
   1002                 {
   1003                     /* If the Target Info is updated then the Target
   1004                      * is connected.
   1005                      */
   1006 #ifdef NFCIP_CHECK
   1007                     if(NULL == psHciContext->p_target_info)
   1008 #endif
   1009                     {
   1010                         status = phHciNfc_NfcIP_Info_Sequence(
   1011                                   psHciContext, pHwRef
   1012 #ifdef NOTIFY_REQD
   1013                                     ,(NULL == psHciContext->p_target_info)
   1014 #endif /* #ifdef NOTIFY_REQD */
   1015                                            );
   1016                     }
   1017 #ifdef NFCIP_CHECK
   1018                     else
   1019                     {
   1020                         status = phHciNfc_NfcIP_GetATRInfo(
   1021                                             psHciContext, pHwRef, NFCIP_INITIATOR );
   1022 #if defined(NXP_NFCIP_ACTIVATE_DELAY)
   1023                         if (
   1024                             (NFCSTATUS_PENDING == status)
   1025                             && ( NFCIP_ACTIVATE_DELAY <= nfc_atr_retry)
   1026                             )
   1027                         {
   1028                             nfc_atr_retry = 0;
   1029                             status = NFCSTATUS_SUCCESS;
   1030                         }
   1031                         else
   1032                         {
   1033                             nfc_atr_retry++;
   1034                         }
   1035 #else
   1036                         status = ((NFCSTATUS_PENDING == status )?
   1037                                         NFCSTATUS_SUCCESS : status);
   1038 #endif
   1039                     }
   1040 #endif
   1041                     break;
   1042                 }
   1043 #endif
   1044 #ifdef TYPE_B
   1045                 case phHal_eISO14443_B_PCD:
   1046                 {
   1047                     if(NULL == psHciContext->p_target_info)
   1048                     {
   1049                         status = phHciNfc_ReaderB_Info_Sequence(
   1050                                                     psHciContext, pHwRef );
   1051                     }
   1052                     break;
   1053                 }
   1054 #endif /* #ifdef TYPE_B */
   1055 #ifdef TYPE_FELICA
   1056                 case phHal_eFelica_PCD:
   1057                 {
   1058                     if(NULL == psHciContext->p_target_info)
   1059                     {
   1060 #if defined(NXP_NFCIP_ACTIVATE_DELAY)
   1061                         nfc_atr_retry = 0;
   1062 #endif
   1063                         status = phHciNfc_Felica_Info_Sequence(
   1064                                                     psHciContext, pHwRef );
   1065                     }
   1066                     break;
   1067                 }
   1068 #endif /* #ifdef TYPE_FELICA */
   1069 #ifdef TYPE_JEWEL
   1070                 case phHal_eJewel_PCD:
   1071                 {
   1072                     if(NULL == psHciContext->p_target_info)
   1073                     {
   1074                         status = phHciNfc_Jewel_Info_Sequence(
   1075                                                     psHciContext, pHwRef );
   1076                     }
   1077                     break;
   1078                 }
   1079 #endif /* #ifdef TYPE_JEWEL */
   1080 #if defined(TYPE_ISO15693)
   1081                 case phHal_eISO15693_PCD:
   1082                 {
   1083                     if(NULL == psHciContext->p_target_info)
   1084                     {
   1085                         status = phHciNfc_ISO15693_Info_Sequence(
   1086                                                     psHciContext, pHwRef );
   1087                     }
   1088                     break;
   1089                 }
   1090 #endif
   1091                 default:
   1092                 {
   1093                     break;
   1094                 }
   1095             }
   1096 
   1097         }/* End of the Reader Info Memory Check */
   1098 
   1099     } /* End of Null Context Check */
   1100 
   1101     return status;
   1102 
   1103 }
   1104 
   1105 
   1106 /*!
   1107  * \brief Connects the the selected tag via RF Reader Gates.
   1108  *
   1109  * This function connects the selected tags via RF Reader Gate.
   1110  * This function uses the RF Reader gate based on the type of the
   1111  * tag specified.
   1112  */
   1113 
   1114 
   1115 NFCSTATUS
   1116 phHciNfc_ReaderMgmt_Select(
   1117                                     phHciNfc_sContext_t     *psHciContext,
   1118                                     void                    *pHwRef,
   1119                                     phHal_eRemDevType_t     target_type
   1120                 )
   1121 {
   1122     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
   1123     uint8_t                     reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
   1124 
   1125     if( (NULL == psHciContext) || (NULL == pHwRef) )
   1126     {
   1127       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1128     }
   1129     else
   1130     {
   1131         switch (target_type)
   1132         {
   1133             case phHal_eMifare_PICC:
   1134             case phHal_eISO14443_3A_PICC:
   1135             {
   1136                 /* Get the Reader A Pipe ID */
   1137                 status = phHciNfc_ReaderA_Get_PipeID
   1138                                         (psHciContext, &reader_pipe_id);
   1139 
   1140                 if( (NFCSTATUS_SUCCESS == status)
   1141                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1142                     )
   1143                 {
   1144                     status = phHciNfc_ReaderMgmt_Reactivate(
   1145                             psHciContext, pHwRef, target_type );
   1146                 }
   1147                 break;
   1148             }
   1149             case phHal_eISO14443_A_PICC:
   1150             case phHal_eISO14443_4A_PICC:
   1151             {
   1152 #ifdef ENABLE_AUTO_ACTIVATE
   1153                 /* Get the Reader A Pipe ID */
   1154                 status = phHciNfc_ReaderA_Get_PipeID
   1155                                         (psHciContext, &reader_pipe_id);
   1156 
   1157                 if( (NFCSTATUS_SUCCESS == status)
   1158                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1159                     )
   1160                 {
   1161                     status = phHciNfc_Send_RFReader_Command (psHciContext,
   1162                                     pHwRef, reader_pipe_id, NXP_WR_PRESCHECK );
   1163                 }
   1164 #else
   1165                 status = phHciNfc_ReaderA_Cont_Activate(
   1166                                                     psHciContext, pHwRef);
   1167 #endif /* #ifdef ENABLE_AUTO_ACTIVATE */
   1168                 break;
   1169             }
   1170 #ifdef TYPE_B
   1171             case phHal_eISO14443_B_PICC:
   1172             case phHal_eISO14443_4B_PICC:
   1173             {
   1174                 /* Get the Reader B Pipe ID */
   1175                 status = phHciNfc_ReaderB_Get_PipeID
   1176                                         (psHciContext, &reader_pipe_id);
   1177 
   1178                 if( (NFCSTATUS_SUCCESS == status)
   1179                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1180                     )
   1181                 {
   1182                     status = phHciNfc_Send_RFReader_Command (psHciContext,
   1183                                     pHwRef, reader_pipe_id, NXP_WR_PRESCHECK );
   1184                     /* status = phHciNfc_ReaderA_Set_DataRateMax(
   1185                                         psHciContext, pHwRef,
   1186                                         DATA_RATE_MAX_DEFAULT_VALUE ); */
   1187                     /* status = phHciNfc_ReaderMgmt_Reactivate(
   1188                             psHciContext, pHwRef, target_type ); */
   1189                 }
   1190                 break;
   1191             }
   1192 #endif /* #ifdef TYPE_B */
   1193 #ifdef TYPE_FELICA
   1194             case phHal_eFelica_PICC:
   1195             {
   1196                 status = phHciNfc_Felica_Get_PipeID
   1197                                         (psHciContext, &reader_pipe_id);
   1198 
   1199                 if( (NFCSTATUS_SUCCESS == status)
   1200                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1201                     )
   1202                 {
   1203                     /* Get the Reader Felica Pipe ID */
   1204                     /* status = phHciNfc_ReaderA_Set_DataRateMax(
   1205                                         psHciContext, pHwRef,
   1206                                         DATA_RATE_MAX_DEFAULT_VALUE ); */
   1207                     status = phHciNfc_ReaderMgmt_Reactivate(
   1208                             psHciContext, pHwRef, target_type );
   1209                 }
   1210                 break;
   1211             }
   1212 #endif /* #ifdef TYPE_FELICA */
   1213 #ifdef TYPE_JEWEL
   1214             case phHal_eJewel_PICC:
   1215             {
   1216                 /* Get the Reader jewel Pipe ID */
   1217                 status = phHciNfc_Jewel_Get_PipeID
   1218                                         (psHciContext, &reader_pipe_id);
   1219 
   1220                 if( (NFCSTATUS_SUCCESS == status)
   1221                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1222                     )
   1223                 {
   1224                     status = phHciNfc_Jewel_GetRID(
   1225                                         psHciContext, pHwRef);
   1226                 }
   1227                 break;
   1228             }
   1229 #endif /* #ifdef TYPE_JEWEL */
   1230 #ifdef  TYPE_ISO15693
   1231             case phHal_eISO15693_PICC:
   1232             {
   1233                 /* Get the Reader ISO 15693 Pipe ID */
   1234                 status = phHciNfc_ISO15693_Get_PipeID
   1235                                         (psHciContext, &reader_pipe_id);
   1236 
   1237                 if( (NFCSTATUS_SUCCESS == status)
   1238                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1239                     )
   1240                 {
   1241                     /* TODO */
   1242                     status = phHciNfc_ReaderA_Set_DataRateMax(
   1243                                         psHciContext, pHwRef,
   1244                                         DATA_RATE_MAX_DEFAULT_VALUE );
   1245                 }
   1246                 break;
   1247             }
   1248 #endif /* #ifdef    TYPE_ISO15693 */
   1249 #ifdef ENABLE_P2P
   1250             case phHal_eNfcIP1_Target:
   1251             {
   1252                 if ( (phHal_eISO14443_A_PCD ==
   1253                             psHciContext->host_rf_type )
   1254                    || (phHal_eFelica_PCD ==
   1255                             psHciContext->host_rf_type )
   1256                    )
   1257                 {
   1258                     status = phHciNfc_Initiator_Cont_Activate(
   1259                                                     psHciContext, pHwRef);
   1260                 }
   1261                 else
   1262                 {
   1263                     status = phHciNfc_NfcIP_Presence_Check (psHciContext, pHwRef);
   1264                 }
   1265                 break;
   1266             }
   1267 #endif
   1268 #if 0
   1269             case phHal_eNfcIP1_Initiator:
   1270             {
   1271 
   1272                 break;
   1273             }
   1274 #endif
   1275             default:
   1276             {
   1277                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1278                 break;
   1279             }
   1280 
   1281         } /* End of the tag_type Switch */
   1282     }
   1283 
   1284     return status;
   1285 }
   1286 
   1287 NFCSTATUS
   1288 phHciNfc_ReaderMgmt_UICC_Dispatch(
   1289                                     phHciNfc_sContext_t     *psHciContext,
   1290                                     void                    *pHwRef,
   1291                                     phHal_eRemDevType_t     target_type
   1292                 )
   1293 {
   1294     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
   1295     uint8_t                     reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
   1296     phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;
   1297 
   1298 
   1299     if( (NULL == psHciContext) || (NULL == pHwRef) )
   1300     {
   1301       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1302     }
   1303     else if (NULL == psHciContext->p_target_info)
   1304     {
   1305         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
   1306     }
   1307     else
   1308     {
   1309         switch (target_type)
   1310         {
   1311             case phHal_eISO14443_A_PICC:
   1312             case phHal_eISO14443_4A_PICC:
   1313             {
   1314                 /* Get the Reader A Pipe ID */
   1315                 status = phHciNfc_ReaderA_Get_PipeID(
   1316                                     psHciContext, &reader_pipe_id);
   1317                 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1318                 p_pipe_info->param_info = &psHciContext->p_target_info->
   1319                                     RemoteDevInfo.Iso14443A_Info.Uid;
   1320                 p_pipe_info->param_length = psHciContext->p_target_info->
   1321                                     RemoteDevInfo.Iso14443A_Info.UidLength;
   1322 
   1323                 break;
   1324             }
   1325 #ifdef TYPE_B
   1326             case phHal_eISO14443_B_PICC:
   1327             case phHal_eISO14443_4B_PICC:
   1328             {
   1329                 /* Get the Reader B Pipe ID */
   1330                 status = phHciNfc_ReaderB_Get_PipeID
   1331                     (psHciContext, &reader_pipe_id);
   1332 
   1333                 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1334                 p_pipe_info->param_info = &psHciContext->p_target_info->
   1335                         RemoteDevInfo.Iso14443B_Info.AtqB.AtqResInfo.Pupi;
   1336                 p_pipe_info->param_length = PHHAL_PUPI_LENGTH;
   1337                 break;
   1338             }
   1339 #endif /* #ifdef TYPE_B */
   1340             case phHal_eMifare_PICC:
   1341             case phHal_eISO14443_3A_PICC:
   1342             default:
   1343             {
   1344                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1345                 break;
   1346             }
   1347 
   1348         } /* End of the tag_type Switch */
   1349     }
   1350     if( (NFCSTATUS_SUCCESS == status)
   1351         && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1352         )
   1353     {
   1354         status = phHciNfc_Send_RFReader_Command (psHciContext,
   1355                         pHwRef, reader_pipe_id, NXP_WR_DISPATCH_TO_UICC );
   1356     }
   1357 
   1358     return status;
   1359 }
   1360 
   1361 
   1362 NFCSTATUS
   1363 phHciNfc_ReaderMgmt_Reactivate(
   1364                                     phHciNfc_sContext_t     *psHciContext,
   1365                                     void                    *pHwRef,
   1366                                     phHal_eRemDevType_t     target_type
   1367                 )
   1368 {
   1369     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
   1370     uint8_t                     reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
   1371     phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;
   1372 
   1373 
   1374     if( (NULL == psHciContext) || (NULL == pHwRef) )
   1375     {
   1376       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1377     }
   1378     else if (NULL == psHciContext->p_target_info)
   1379     {
   1380         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
   1381     }
   1382     else
   1383     {
   1384         switch (target_type)
   1385         {
   1386             case phHal_eISO14443_A_PICC:
   1387             case phHal_eMifare_PICC:
   1388             case phHal_eISO14443_4A_PICC:
   1389             case phHal_eISO14443_3A_PICC:
   1390             {
   1391                 /* Get the Reader A Pipe ID */
   1392                 status = phHciNfc_ReaderA_Get_PipeID(
   1393                                     psHciContext, &reader_pipe_id);
   1394                 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1395                 p_pipe_info->param_info = &psHciContext->p_target_info->
   1396                                     RemoteDevInfo.Iso14443A_Info.Uid;
   1397                 p_pipe_info->param_length = psHciContext->p_target_info->
   1398                                     RemoteDevInfo.Iso14443A_Info.UidLength;
   1399 
   1400                 break;
   1401             }
   1402 #ifdef TYPE_B
   1403             case phHal_eISO14443_B_PICC:
   1404             case phHal_eISO14443_4B_PICC:
   1405             {
   1406                 /* Get the Reader B Pipe ID */
   1407                 status = phHciNfc_ReaderB_Get_PipeID
   1408                     (psHciContext, &reader_pipe_id);
   1409 
   1410                 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1411                 p_pipe_info->param_info = &psHciContext->p_target_info->
   1412                         RemoteDevInfo.Iso14443B_Info.AtqB.AtqResInfo.Pupi;
   1413                 p_pipe_info->param_length = PHHAL_PUPI_LENGTH;
   1414                 break;
   1415             }
   1416 #endif /* #ifdef TYPE_B */
   1417 #ifdef TYPE_FELICA
   1418             case phHal_eFelica_PICC:
   1419             {
   1420                 /* Get the Felica Reader Pipe ID */
   1421                 status = phHciNfc_Felica_Get_PipeID
   1422                                         (psHciContext, &reader_pipe_id);
   1423 
   1424                 if( (NFCSTATUS_SUCCESS == status)
   1425                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1426                     )
   1427                 {
   1428                 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1429                 p_pipe_info->param_info = &psHciContext->p_target_info->
   1430                     RemoteDevInfo.Felica_Info.IDm;
   1431                 p_pipe_info->param_length = PHHAL_FEL_ID_LEN;
   1432                 }
   1433                 break;
   1434             }
   1435 #endif /* #ifdef TYPE_FELICA */
   1436 #ifdef ENABLE_P2P
   1437             case phHal_eNfcIP1_Target:
   1438             {
   1439                 /* Get the Initiator Pipe ID */
   1440                 status = phHciNfc_Initiator_Get_PipeID(
   1441                                     psHciContext, &reader_pipe_id);
   1442                 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1443                 p_pipe_info->param_info = &psHciContext->p_target_info->
   1444                                             RemoteDevInfo.NfcIP_Info.NFCID;
   1445                 p_pipe_info->param_length = psHciContext->p_target_info->
   1446                                         RemoteDevInfo.NfcIP_Info.NFCID_Length;
   1447                 break;
   1448             }
   1449             case phHal_eNfcIP1_Initiator:
   1450             {
   1451                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1452                 break;
   1453             }
   1454 #endif /* #ifdef ENABLE_P2P */
   1455             default:
   1456             {
   1457                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1458                 break;
   1459             }
   1460 
   1461         } /* End of the tag_type Switch */
   1462     }
   1463     if( (NFCSTATUS_SUCCESS == status)
   1464         && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1465         )
   1466     {
   1467         status = phHciNfc_Send_RFReader_Command (psHciContext,
   1468                         pHwRef, reader_pipe_id, NXP_WR_ACTIVATE_ID );
   1469     }
   1470 
   1471     return status;
   1472 }
   1473 
   1474 
   1475 /*!
   1476 * \brief Activates the next Remote Target in the field.
   1477 *
   1478 * This function selects and activates the next tag present in the field.
   1479 */
   1480 
   1481 
   1482 NFCSTATUS
   1483 phHciNfc_ReaderMgmt_Activate_Next(
   1484                                   phHciNfc_sContext_t       *psHciContext,
   1485                                   void                  *pHwRef
   1486                                   )
   1487 {
   1488     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
   1489     /* phHciNfc_Pipe_Info_t     *p_pipe_info = NULL; */
   1490     uint8_t                     reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
   1491 
   1492     if( (NULL == psHciContext) || (NULL == pHwRef) )
   1493     {
   1494         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1495     }
   1496     else
   1497     {
   1498         switch ( psHciContext->host_rf_type )
   1499         {
   1500             case phHal_eISO14443_A_PCD:
   1501             {
   1502                 /* Get the Reader A Pipe ID */
   1503                 status = phHciNfc_ReaderA_Get_PipeID
   1504                     (psHciContext, &reader_pipe_id);
   1505 
   1506                 break;
   1507             }
   1508 #ifdef TYPE_B
   1509             case phHal_eISO14443_B_PCD:
   1510             {
   1511                 /* Get the Reader B Pipe ID */
   1512                 status = phHciNfc_ReaderB_Get_PipeID
   1513                     (psHciContext, &reader_pipe_id);
   1514 
   1515                 break;
   1516             }
   1517 #endif /* #ifdef TYPE_B */
   1518 #ifdef TYPE_FELICA
   1519             case phHal_eFelica_PCD:
   1520             {
   1521                 /* Get the Felica Reader Pipe ID */
   1522                 status = phHciNfc_Felica_Get_PipeID
   1523                                         (psHciContext, &reader_pipe_id);
   1524 
   1525                 break;
   1526             }
   1527 #endif /* #ifdef TYPE_FELICA */
   1528 #ifdef  TYPE_ISO15693
   1529             case phHal_eISO15693_PCD:
   1530             {
   1531                 /* Get the ISO 15693 Reader Pipe ID */
   1532                 status = phHciNfc_ISO15693_Get_PipeID
   1533                                         (psHciContext, &reader_pipe_id);
   1534 
   1535                 break;
   1536             }
   1537 #endif /* #ifdef TYPE_ISO15693 */
   1538             default:
   1539             {
   1540                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1541                 break;
   1542             }
   1543 
   1544         } /* End of the reader_type Switch */
   1545         if( (NFCSTATUS_SUCCESS == status)
   1546             && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1547           )
   1548         {
   1549             status = phHciNfc_Send_RFReader_Command (psHciContext,
   1550                 pHwRef, reader_pipe_id, NXP_WR_ACTIVATE_NEXT );
   1551         }
   1552 
   1553     }
   1554 
   1555     return status;
   1556 
   1557 }
   1558 
   1559 /*!
   1560 * \brief Checks the presence of the Remote Target in the field.
   1561 *
   1562 * This function checks the presence of the tag present in the field.
   1563 */
   1564 
   1565 
   1566 NFCSTATUS
   1567 phHciNfc_ReaderMgmt_Presence_Check(
   1568                                   phHciNfc_sContext_t       *psHciContext,
   1569                                   void                  *pHwRef
   1570                                   )
   1571 {
   1572     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
   1573     /* phHciNfc_Pipe_Info_t     *p_pipe_info = NULL; */
   1574     uint8_t                     reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
   1575     phHal_eRemDevType_t         target_type = phHal_eUnknown_DevType;
   1576 
   1577     if( (NULL == psHciContext) || (NULL == pHwRef) )
   1578     {
   1579         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1580     }
   1581     else
   1582     {
   1583         target_type = psHciContext->p_target_info->RemDevType;
   1584         switch (target_type)
   1585         {
   1586             case phHal_eMifare_PICC:
   1587             case phHal_eISO14443_3A_PICC:
   1588             {
   1589                 /* Get the Reader A Pipe ID */
   1590                 status = phHciNfc_ReaderA_Get_PipeID
   1591                     (psHciContext, &reader_pipe_id);
   1592 
   1593                 if( (NFCSTATUS_SUCCESS == status)
   1594                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1595                     )
   1596                 {
   1597                     status = phHciNfc_ReaderMgmt_Reactivate(
   1598                             psHciContext, pHwRef, target_type );
   1599                 }
   1600                 break;
   1601             }
   1602             case phHal_eISO14443_A_PICC:
   1603             case phHal_eISO14443_4A_PICC:
   1604             {
   1605                 /* Get the Reader A Pipe ID */
   1606                 status = phHciNfc_ReaderA_Get_PipeID
   1607                     (psHciContext, &reader_pipe_id);
   1608 
   1609                 if( (NFCSTATUS_SUCCESS == status)
   1610                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1611                     )
   1612                 {
   1613                     status = phHciNfc_Send_RFReader_Command (psHciContext,
   1614                         pHwRef, reader_pipe_id, NXP_WR_PRESCHECK );
   1615                 }
   1616                 break;
   1617             }
   1618 #ifdef ENABLE_P2P
   1619             case phHal_eNfcIP1_Target:
   1620             {
   1621                 status = phHciNfc_NfcIP_Presence_Check (psHciContext, pHwRef);
   1622                 break;
   1623             }
   1624 #endif
   1625 #ifdef TYPE_B
   1626             case phHal_eISO14443_B_PICC:
   1627             case phHal_eISO14443_4B_PICC:
   1628             {
   1629                 /* Get the Reader B Pipe ID */
   1630                 status = phHciNfc_ReaderB_Get_PipeID
   1631                     (psHciContext, &reader_pipe_id);
   1632 
   1633                 if( (NFCSTATUS_SUCCESS == status)
   1634                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1635                     )
   1636                 {
   1637                     status = phHciNfc_Send_RFReader_Command (psHciContext,
   1638                             pHwRef, reader_pipe_id, NXP_WR_PRESCHECK );
   1639                 }
   1640                 break;
   1641             }
   1642 #endif /* #ifdef TYPE_B */
   1643 #ifdef TYPE_FELICA
   1644             case phHal_eFelica_PICC:
   1645             {
   1646                 /* Get the Felica Reader Pipe ID */
   1647                 status = phHciNfc_Felica_Get_PipeID
   1648                                         (psHciContext, &reader_pipe_id);
   1649 
   1650                 if( (NFCSTATUS_SUCCESS == status)
   1651                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1652                     )
   1653                 {
   1654                     status = phHciNfc_Felica_Request_Mode(psHciContext, pHwRef);
   1655                 }
   1656                 break;
   1657             }
   1658 #endif /* #ifdef TYPE_FELICA */
   1659 #ifdef TYPE_JEWEL
   1660             case phHal_eJewel_PICC:
   1661             {
   1662                 /* Get the Jewel Reader Pipe ID */
   1663                 status = phHciNfc_Jewel_Get_PipeID
   1664                                         (psHciContext, &reader_pipe_id);
   1665 
   1666                 if( (NFCSTATUS_SUCCESS == status)
   1667                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1668                     )
   1669                 {
   1670                     /* status = PHNFCSTVAL(CID_NFC_HCI,
   1671                                     NFCSTATUS_FEATURE_NOT_SUPPORTED); */
   1672                       status = phHciNfc_Jewel_GetRID(
   1673                                         psHciContext, pHwRef);
   1674                 }
   1675                 break;
   1676             }
   1677 #endif /* #ifdef TYPE_JEWEL */
   1678 #ifdef  TYPE_ISO15693
   1679             case phHal_eISO15693_PICC:
   1680             {
   1681                 /* Get the Reader ISO 15693 Pipe ID */
   1682                 status = phHciNfc_ISO15693_Get_PipeID
   1683                                         (psHciContext, &reader_pipe_id);
   1684 
   1685                 if( (NFCSTATUS_SUCCESS == status)
   1686                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1687                     )
   1688                 {
   1689                     uint8_t cmd[11];
   1690                     phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
   1691                     p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1692                     p_pipe_info->param_info = &cmd;
   1693                     p_pipe_info->param_length = 11;
   1694                     // masked inventory command:
   1695                     // set #slots to 1 to use mask without padding,
   1696                     // need to set inventory flag to enable setting #slots
   1697                     cmd[0] = 0x04 | 0x20; // FLAG_INVENTORY | FLAG_SLOTS
   1698                     cmd[1] = 0x01; // CMD_INVENTORY
   1699                     cmd[2] = 64; // mask bit-length
   1700                     memcpy(cmd + 3, &(psHciContext->p_target_info->RemoteDevInfo.Iso15693_Info.Uid), 8);
   1701                     status = phHciNfc_Send_ISO15693_Command(
   1702                         psHciContext,  pHwRef
   1703                         ,reader_pipe_id, NXP_ISO15693_CMD );
   1704 
   1705                 }
   1706                 break;
   1707             }
   1708 #endif /* #ifdef    TYPE_ISO15693 */
   1709             default:
   1710             {
   1711                 status = PHNFCSTVAL(CID_NFC_HCI,
   1712                                     NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1713                 break;
   1714             }
   1715 
   1716         } /* End of the tag_type Switch */
   1717     }
   1718 
   1719     return status;
   1720 
   1721 }
   1722 
   1723 
   1724 /*!
   1725  * \brief Disconnects the the selected tag.
   1726  *
   1727  * This function disconnects the selected tags via RF Reader Gate.
   1728  * This function uses the RF Reader gate based on the type of the
   1729  * tag specified.
   1730  */
   1731 
   1732 
   1733 NFCSTATUS
   1734 phHciNfc_ReaderMgmt_Deselect(
   1735                                     phHciNfc_sContext_t     *psHciContext,
   1736                                     void                    *pHwRef,
   1737                                     phHal_eRemDevType_t     target_type,
   1738                                     uint8_t                 re_poll
   1739                 )
   1740 {
   1741     static  uint8_t             rls_param = FALSE;
   1742     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
   1743     uint8_t                     reader_pipe_id =
   1744                                     (uint8_t) HCI_UNKNOWN_PIPE_ID;
   1745     phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;
   1746 
   1747 
   1748 
   1749     if( (NULL == psHciContext)
   1750         || (NULL == pHwRef)
   1751         )
   1752     {
   1753       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1754     }
   1755     else
   1756     {
   1757         rls_param = re_poll;
   1758 
   1759         switch (target_type)
   1760         {
   1761             case phHal_eMifare_PICC:
   1762             case phHal_eISO14443_A_PICC:
   1763             case phHal_eISO14443_3A_PICC:
   1764             case phHal_eISO14443_4A_PICC:
   1765             {
   1766                 /* Get the Reader A Pipe ID */
   1767                 status = phHciNfc_ReaderA_Get_PipeID
   1768                                         (psHciContext, &reader_pipe_id);
   1769                 break;
   1770             }
   1771 #ifdef TYPE_B
   1772             case phHal_eISO14443_B_PICC:
   1773             case phHal_eISO14443_4B_PICC:
   1774             {
   1775                 /* Get the Reader B Pipe ID */
   1776                 status = phHciNfc_ReaderB_Get_PipeID
   1777                     (psHciContext, &reader_pipe_id);
   1778 
   1779                 break;
   1780             }
   1781 #endif /* #ifdef TYPE_B */
   1782 #ifdef TYPE_FELICA
   1783             case phHal_eFelica_PICC:
   1784             {
   1785                 /* Get the Felica Pipe ID */
   1786                 status = phHciNfc_Felica_Get_PipeID
   1787                     (psHciContext, &reader_pipe_id);
   1788 
   1789                 break;
   1790             }
   1791 #endif /* #ifdef TYPE_FELICA */
   1792 #ifdef TYPE_JEWEL
   1793             case phHal_eJewel_PICC:
   1794             {
   1795                 /* Get the Jewel Pipe ID */
   1796                 status = phHciNfc_Jewel_Get_PipeID
   1797                     (psHciContext, &reader_pipe_id);
   1798 
   1799                 break;
   1800             }
   1801 #endif /* #ifdef TYPE_JEWEL */
   1802 #ifdef  TYPE_ISO15693
   1803             case phHal_eISO15693_PICC:
   1804             {
   1805                 /* Get the ISO 15693 Pipe ID */
   1806                 status = phHciNfc_ISO15693_Get_PipeID
   1807                     (psHciContext, &reader_pipe_id);
   1808 
   1809                 break;
   1810             }
   1811 #endif /* #ifdef    TYPE_ISO15693 */
   1812 #ifdef ENABLE_P2P
   1813             case phHal_eNfcIP1_Target:
   1814             {
   1815                 /* Get the Reader A Pipe ID */
   1816                 status = phHciNfc_Initiator_Get_PipeID
   1817                                         (psHciContext, &reader_pipe_id);
   1818 
   1819                 break;
   1820             }
   1821 #endif
   1822             default:
   1823             {
   1824                 status = PHNFCSTVAL(CID_NFC_HCI,
   1825                                             NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1826                 break;
   1827             }
   1828 
   1829         } /* End of the tag_type Switch */
   1830         p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1831         if( (NFCSTATUS_SUCCESS == status)
   1832             && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1833             && ( NULL != p_pipe_info ) )
   1834         {
   1835             if (TRUE == rls_param)
   1836             {
   1837                 p_pipe_info->param_info = &rls_param;
   1838                 p_pipe_info->param_length = sizeof(rls_param);
   1839             }
   1840             status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef,
   1841                         reader_pipe_id,(uint8_t) NXP_EVT_RELEASE_TARGET );
   1842         }
   1843     }
   1844 
   1845     return status;
   1846 }
   1847 
   1848 
   1849 /*!
   1850  * \brief Exchanges the data to/from the selected tags via RF Reader Gates.
   1851  *
   1852  * This function Exchanges the data to/from the selected tags
   1853  * via RF Reader Gates. This function uses the RF Reader gate based on the
   1854  * type of the selected tag and the type of the Reader gate specified.
   1855  */
   1856 
   1857 
   1858 NFCSTATUS
   1859 phHciNfc_ReaderMgmt_Exchange_Data(
   1860                                     phHciNfc_sContext_t     *psHciContext,
   1861                                     void                    *pHwRef,
   1862                                     phHciNfc_XchgInfo_t     *p_xchg_info
   1863                 )
   1864 {
   1865     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
   1866     phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;
   1867     uint8_t                     reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
   1868     phHal_eRemDevType_t         target_type = phHal_eUnknown_DevType;
   1869 
   1870     if( (NULL == psHciContext) || (NULL == pHwRef) )
   1871     {
   1872       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1873     }
   1874     else if (NULL == psHciContext->p_xchg_info)
   1875     {
   1876         status = PHNFCSTVAL(CID_NFC_HCI,
   1877                 NFCSTATUS_INVALID_HCI_INFORMATION);
   1878 
   1879     }
   1880     else
   1881     {
   1882         switch (psHciContext->host_rf_type)
   1883         {
   1884             case phHal_eISO14443_A_PCD:
   1885             {
   1886                 /* Get the Reader A Pipe ID */
   1887                 status = phHciNfc_ReaderA_Get_PipeID
   1888                                         (psHciContext, &reader_pipe_id);
   1889 
   1890                 if( (NFCSTATUS_SUCCESS == status)
   1891                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1892                     )
   1893                 {
   1894                     p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1895                     p_pipe_info->param_info = p_xchg_info->tx_buffer;
   1896                     p_pipe_info->param_length = p_xchg_info->tx_length;
   1897                     target_type = psHciContext->p_target_info->RemDevType;
   1898                     switch (target_type)
   1899                     {
   1900                         case phHal_eMifare_PICC:
   1901                         case phHal_eISO14443_3A_PICC:
   1902                         {
   1903                             if ((uint8_t)phHal_eMifareRaw ==
   1904                                             p_xchg_info->params.tag_info.cmd_type)
   1905                             {
   1906                                 status = phHciNfc_Send_ReaderA_Command(
   1907                                     psHciContext,  pHwRef
   1908                                     ,reader_pipe_id, NXP_MIFARE_RAW );
   1909                             }
   1910                             else
   1911                             {
   1912                                 status = phHciNfc_Send_ReaderA_Command(
   1913                                     psHciContext, pHwRef,
   1914                                     reader_pipe_id, NXP_MIFARE_CMD );
   1915                             }
   1916                             break;
   1917                         }
   1918                         case phHal_eISO14443_A_PICC:
   1919                         case phHal_eISO14443_4A_PICC:
   1920                         {
   1921                             status = phHciNfc_Send_RFReader_Command(
   1922                                         psHciContext, pHwRef,
   1923                                         reader_pipe_id, WR_XCHGDATA );
   1924                             break;
   1925                         }
   1926                         default:
   1927                         {
   1928                             status = PHNFCSTVAL(CID_NFC_HCI,
   1929                                                 NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1930                             break;
   1931                         }
   1932                     } /* End of the tag_type Switch */
   1933                 } /* End of Pipe ID Check */
   1934                 break;
   1935             }
   1936 #ifdef TYPE_B
   1937             case phHal_eISO14443_B_PCD:
   1938             {
   1939                 /* Get the Reader B Pipe ID */
   1940                 status = phHciNfc_ReaderB_Get_PipeID
   1941                                         (psHciContext, &reader_pipe_id);
   1942 
   1943                 if( (NFCSTATUS_SUCCESS == status)
   1944                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1945                     )
   1946                 {
   1947                     p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1948                     p_pipe_info->param_info = p_xchg_info->tx_buffer;
   1949                     p_pipe_info->param_length = p_xchg_info->tx_length;
   1950                     status = phHciNfc_Send_RFReader_Command(
   1951                                 psHciContext, pHwRef,
   1952                                 reader_pipe_id, WR_XCHGDATA );
   1953                 }
   1954                 break;
   1955             }
   1956 #endif /* #ifdef TYPE_B */
   1957 #ifdef TYPE_FELICA
   1958             case phHal_eFelica_PCD:
   1959             {
   1960                 /* Get the Felica Reader Pipe ID */
   1961                 status = phHciNfc_Felica_Get_PipeID
   1962                                         (psHciContext, &reader_pipe_id);
   1963 
   1964                 if( (NFCSTATUS_SUCCESS == status)
   1965                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1966                     )
   1967                 {
   1968                     p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   1969                     p_pipe_info->param_info = p_xchg_info->tx_buffer;
   1970                     p_pipe_info->param_length = p_xchg_info->tx_length;
   1971                     if ((uint8_t)phHal_eFelica_Raw ==
   1972                                     p_xchg_info->params.tag_info.cmd_type)
   1973                     {
   1974                         status = phHciNfc_Send_Felica_Command(
   1975                             psHciContext,  pHwRef
   1976                             ,reader_pipe_id, NXP_FELICA_RAW );
   1977                     }
   1978                     else
   1979                     {
   1980                         status = phHciNfc_Send_Felica_Command(
   1981                             psHciContext, pHwRef,
   1982                             reader_pipe_id, NXP_FELICA_CMD );
   1983                     }
   1984                 }
   1985                 break;
   1986             }
   1987 #endif /* #ifdef TYPE_FELICA */
   1988 #if defined(TYPE_ISO15693)
   1989             case phHal_eISO15693_PCD:
   1990             {
   1991                 /* Get the ISO15693 Reader Pipe ID */
   1992                 status = phHciNfc_ISO15693_Get_PipeID
   1993                                         (psHciContext, &reader_pipe_id);
   1994 
   1995                 if( (NFCSTATUS_SUCCESS == status)
   1996                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   1997                     )
   1998                 {
   1999                     p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   2000                     p_pipe_info->param_info = p_xchg_info->tx_buffer;
   2001                     p_pipe_info->param_length = p_xchg_info->tx_length;
   2002                     if (((uint8_t)phHal_eIso15693_Cmd  ==
   2003                                     p_xchg_info->params.tag_info.cmd_type)
   2004 #if defined(SUPPORT_ISO15693_RAW)
   2005                         || ((uint8_t) phHal_eIso15693_Raw ==
   2006                                     p_xchg_info->params.tag_info.cmd_type)
   2007 #endif
   2008                      )
   2009                     {
   2010                         status = phHciNfc_Send_ISO15693_Command(
   2011                             psHciContext,  pHwRef
   2012                             ,reader_pipe_id, NXP_ISO15693_CMD );
   2013                     }
   2014                     else
   2015                     {
   2016                         status = PHNFCSTVAL(CID_NFC_HCI,
   2017                                     NFCSTATUS_INVALID_PARAMETER);
   2018                     }
   2019                 }
   2020                 break;
   2021             }
   2022 #endif
   2023 #ifdef TYPE_JEWEL
   2024             case phHal_eJewel_PCD:
   2025             {
   2026                 /* Get the Jewel Reader Pipe ID */
   2027                 status = phHciNfc_Jewel_Get_PipeID
   2028                                         (psHciContext, &reader_pipe_id);
   2029 
   2030                 if( (NFCSTATUS_SUCCESS == status)
   2031                     && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
   2032                     )
   2033                 {
   2034                     uint8_t         transact_type = 0;
   2035                     p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
   2036                     p_pipe_info->param_info = p_xchg_info->tx_buffer;
   2037                     p_pipe_info->param_length = p_xchg_info->tx_length;
   2038                     switch(p_xchg_info->params.tag_info.cmd_type)
   2039                     {
   2040                         case phHal_eJewel_Raw:
   2041                         {
   2042                             transact_type = NXP_JEWEL_RAW;
   2043                             break;
   2044                         }
   2045                         case phHal_eJewel_Invalid:
   2046                         default:
   2047                         {
   2048                             status = PHNFCSTVAL(CID_NFC_HCI,
   2049                                                 NFCSTATUS_INVALID_PARAMETER);
   2050                             break;
   2051                         }
   2052                     }
   2053                     if(0 != transact_type)
   2054                     {
   2055                         status = phHciNfc_Send_Jewel_Command(
   2056                                     psHciContext,  pHwRef,
   2057                                     reader_pipe_id, transact_type );
   2058                     }
   2059                 }
   2060                 break;
   2061             }
   2062 #endif /* #ifdef TYPE_JEWEL */
   2063             default:
   2064             {
   2065                 status = PHNFCSTVAL(CID_NFC_HCI,
   2066                                                 NFCSTATUS_FEATURE_NOT_SUPPORTED);
   2067                 break;
   2068             }
   2069         }/* End of Reader Type Switch */
   2070     }
   2071 
   2072     return status;
   2073 }
   2074 
   2075 
   2076 
   2077 /*!
   2078  * \brief Releases the resources allocated the RF Reader Management.
   2079  *
   2080  * This function Releases the resources allocated the RF Reader Management.
   2081  */
   2082 
   2083 NFCSTATUS
   2084 phHciNfc_ReaderMgmt_Release(
   2085                                 phHciNfc_sContext_t     *psHciContext,
   2086                                 void                    *pHwRef
   2087                              )
   2088 {
   2089     NFCSTATUS                           status = NFCSTATUS_SUCCESS;
   2090     phHciNfc_Pipe_Info_t                *p_pipe_info = NULL;
   2091     phHciNfc_ReaderMgmt_Info_t          *p_reader_mgmt_info=NULL;
   2092 
   2093     if( (NULL == psHciContext) || (NULL == pHwRef) )
   2094     {
   2095       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   2096     }
   2097     else
   2098     {
   2099         if( NULL != psHciContext->p_reader_mgmt_info )
   2100         {
   2101             p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
   2102                                 psHciContext->p_reader_mgmt_info ;
   2103             switch(p_reader_mgmt_info->rf_gate_cur_seq)
   2104             {
   2105                 /* Reader A pipe close sequence */
   2106                 case READERA_PIPE_CLOSE:
   2107                 {
   2108                     p_pipe_info = ((phHciNfc_ReaderA_Info_t *)
   2109                             psHciContext->p_reader_a_info)->p_pipe_info;
   2110 
   2111                     status = phHciNfc_Close_Pipe( psHciContext,
   2112                                                     pHwRef, p_pipe_info );
   2113                     if(status == NFCSTATUS_SUCCESS)
   2114                     {
   2115                         p_reader_mgmt_info->rf_gate_next_seq =
   2116                                                     READERB_PIPE_CLOSE;
   2117                         /* status = NFCSTATUS_PENDING; */
   2118                     }
   2119                     break;
   2120                 }
   2121 #ifdef TYPE_B
   2122                 /* Reader B pipe close sequence */
   2123                 case READERB_PIPE_CLOSE:
   2124                 {
   2125                     p_pipe_info = ((phHciNfc_ReaderB_Info_t *)
   2126                             psHciContext->p_reader_b_info)->p_pipe_info;
   2127 
   2128                     status = phHciNfc_Close_Pipe( psHciContext,
   2129                                                         pHwRef, p_pipe_info );
   2130                     if(status == NFCSTATUS_SUCCESS)
   2131                     {
   2132                         p_reader_mgmt_info->rf_gate_next_seq =
   2133                                                         FELICA_PROP_PIPE_CLOSE;
   2134                         status = NFCSTATUS_PENDING;
   2135                     }
   2136                     break;
   2137                 }
   2138 #endif /* #ifdef TYPE_B */
   2139 #ifdef TYPE_FELICA
   2140                 /* Felica Reader pipe close sequence */
   2141                 case FELICA_PROP_PIPE_CLOSE:
   2142                 {
   2143                     p_pipe_info = ((phHciNfc_Felica_Info_t *)
   2144                             psHciContext->p_felica_info)->p_pipe_info;
   2145 
   2146                     status = phHciNfc_Close_Pipe( psHciContext,
   2147                                                         pHwRef, p_pipe_info );
   2148                     if(status == NFCSTATUS_SUCCESS)
   2149                     {
   2150                         p_reader_mgmt_info->rf_gate_next_seq =
   2151                                                 NFCIP1_INITIATOR_PIPE_CLOSE;
   2152                         /* status = NFCSTATUS_PENDING; */
   2153                     }
   2154                     break;
   2155                 }
   2156 #endif /* #ifdef TYPE_FELICA */
   2157 #ifdef ENABLE_P2P
   2158                 /* NFC-IP1 Initiator pipe Close sequence */
   2159                 case NFCIP1_INITIATOR_PIPE_CLOSE:
   2160                 {
   2161                     p_pipe_info =
   2162                         ((phHciNfc_NfcIP_Info_t *)psHciContext->
   2163                                     p_nfcip_info)->p_init_pipe_info;
   2164                     if(NULL == p_pipe_info )
   2165                     {
   2166                         status = PHNFCSTVAL(CID_NFC_HCI,
   2167                                         NFCSTATUS_INVALID_HCI_SEQUENCE);
   2168                     }
   2169                     else
   2170                     {
   2171                         status = phHciNfc_Open_Pipe( psHciContext,
   2172                                                         pHwRef, p_pipe_info );
   2173                         if(status == NFCSTATUS_SUCCESS)
   2174                         {
   2175                             p_reader_mgmt_info->rf_gate_next_seq = READERA_PIPE_CLOSE;
   2176                             status = NFCSTATUS_PENDING;
   2177                         }
   2178                     }
   2179                     break;
   2180                 }
   2181 #endif /* #ifdef ENABLE_P2P */
   2182                 default:
   2183                 {
   2184                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
   2185                     break;
   2186                 }
   2187 
   2188             }/* End of the Sequence Switch */
   2189 
   2190         }/* End of the Reader Info Memory Check */
   2191 
   2192     } /* End of Null Context Check */
   2193 
   2194     return status;
   2195 }
   2196 
   2197 
   2198 /*!
   2199  * \brief Sends the RF Reader HCI Events to the connected reader device.
   2200  *
   2201  * This function Sends the RF Reader HCI Event frames in the HCP packet format to the
   2202  * connected reader device.
   2203  */
   2204 
   2205  NFCSTATUS
   2206  phHciNfc_Send_RFReader_Event (
   2207                                 phHciNfc_sContext_t *psHciContext,
   2208                                 void                *pHwRef,
   2209                                 uint8_t             pipe_id,
   2210                                 uint8_t             event
   2211                     )
   2212  {
   2213     phHciNfc_HCP_Packet_t   *hcp_packet = NULL;
   2214     phHciNfc_HCP_Message_t  *hcp_message = NULL;
   2215     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;
   2216     uint8_t                 length = 0;
   2217     uint8_t                 i = 0;
   2218     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   2219 
   2220     if( (NULL == psHciContext)
   2221         || ( pipe_id > PHHCINFC_MAX_PIPE)
   2222         ||(NULL == psHciContext->p_pipe_list[pipe_id])
   2223       )
   2224     {
   2225         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   2226         HCI_DEBUG("%s: Invalid Arguments passed \n",
   2227                                                 "phHciNfc_Send_RFReader_Event");
   2228     }
   2229     else
   2230     {
   2231         p_pipe_info = (phHciNfc_Pipe_Info_t *)
   2232                                 psHciContext->p_pipe_list[pipe_id];
   2233         psHciContext->tx_total = 0 ;
   2234         length +=  HCP_HEADER_LEN ;
   2235         switch( event )
   2236         {
   2237             case EVT_READER_REQUESTED:
   2238             case EVT_END_OPERATION:
   2239             {
   2240 
   2241                 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
   2242                 /* Construct the HCP Frame */
   2243                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
   2244                                         (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event);
   2245                 break;
   2246             }
   2247             case NXP_EVT_RELEASE_TARGET:
   2248             {
   2249                 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
   2250                 /* Construct the HCP Frame */
   2251                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
   2252                                         (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event);
   2253                 hcp_message = &(hcp_packet->msg.message);
   2254                 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
   2255                                             i, p_pipe_info->param_info,
   2256                                             p_pipe_info->param_length);
   2257                 length =(uint16_t)(length + i + p_pipe_info->param_length);
   2258                 break;
   2259             }
   2260             default:
   2261             {
   2262                 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED );
   2263                 HCI_DEBUG("%s: Statement Should Not Occur \n",
   2264                                             "phHciNfc_Send_RFReader_Event");
   2265                 break;
   2266             }
   2267         }
   2268         if( NFCSTATUS_SUCCESS == status )
   2269         {
   2270             p_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT ;
   2271             p_pipe_info->prev_msg = event ;
   2272             psHciContext->tx_total = length;
   2273 
   2274             /* Send the Constructed HCP packet to the lower layer */
   2275             status = phHciNfc_Send_HCP( psHciContext, pHwRef );
   2276             p_pipe_info->prev_status = NFCSTATUS_PENDING;
   2277         }
   2278     }
   2279 
   2280     return status;
   2281 }
   2282 
   2283 /*!
   2284  * \brief Sends the RF Reader HCI Additonal Commands to the connected
   2285  * reader device.
   2286  *
   2287  * This function Sends the RF Reader HCI Command frames in the HCP packet
   2288  * format to the connected reader device.
   2289  */
   2290 
   2291  NFCSTATUS
   2292  phHciNfc_Send_RFReader_Command (
   2293                                 phHciNfc_sContext_t *psHciContext,
   2294                                 void                *pHwRef,
   2295                                 uint8_t             pipe_id,
   2296                                 uint8_t             cmd
   2297                     )
   2298  {
   2299     phHciNfc_HCP_Packet_t   *hcp_packet = NULL;
   2300     phHciNfc_HCP_Message_t  *hcp_message = NULL;
   2301     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;
   2302     uint8_t                 i = 0;
   2303     uint16_t                 length=0;
   2304     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   2305 
   2306     if( (NULL == psHciContext)
   2307         || ( pipe_id > PHHCINFC_MAX_PIPE)
   2308         ||(NULL == psHciContext->p_pipe_list[pipe_id])
   2309       )
   2310     {
   2311         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   2312         HCI_DEBUG("%s: Invalid Arguments passed \n",
   2313                                                 "phHciNfc_Send_RFReader_Command");
   2314     }
   2315     else
   2316     {
   2317         p_pipe_info = (phHciNfc_Pipe_Info_t *)
   2318                                 psHciContext->p_pipe_list[pipe_id];
   2319         psHciContext->tx_total = 0 ;
   2320         length +=  HCP_HEADER_LEN ;
   2321         switch( cmd )
   2322         {
   2323             case WR_XCHGDATA:
   2324             {
   2325 
   2326                 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
   2327                 /* Construct the HCP Frame */
   2328                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
   2329                                         (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
   2330                 hcp_message = &(hcp_packet->msg.message);
   2331                 /* Frame Wait Timeout */
   2332                 hcp_message->payload[i++] = nxp_nfc_isoxchg_timeout ;
   2333                 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
   2334                                             i, p_pipe_info->param_info,
   2335                                             p_pipe_info->param_length);
   2336                 length =(uint16_t)(length + i + p_pipe_info->param_length);
   2337                 break;
   2338             }
   2339             case NXP_WR_PRESCHECK:
   2340             case NXP_WR_ACTIVATE_NEXT:
   2341             {
   2342 
   2343                 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
   2344                 /* Construct the HCP Frame */
   2345                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
   2346                                         (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
   2347                 break;
   2348             }
   2349             case NXP_WR_DISPATCH_TO_UICC:
   2350             case NXP_WR_ACTIVATE_ID:
   2351             {
   2352 
   2353                 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
   2354                 /* Construct the HCP Frame */
   2355                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
   2356                                         (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
   2357                 hcp_message = &(hcp_packet->msg.message);
   2358                 /* UID of the Card */
   2359                 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
   2360                                             i, p_pipe_info->param_info,
   2361                                             p_pipe_info->param_length);
   2362                 length =(uint16_t)(length + i + p_pipe_info->param_length);
   2363                 break;
   2364             }
   2365             default:
   2366             {
   2367                 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED );
   2368                 HCI_DEBUG("%s: Statement Should Not Occur \n",
   2369                                                 "phHciNfc_Send_RFReader_Command");
   2370                 break;
   2371             }
   2372         }
   2373         if( NFCSTATUS_SUCCESS == status )
   2374         {
   2375             p_pipe_info->sent_msg_type = HCP_MSG_TYPE_COMMAND;
   2376             p_pipe_info->prev_msg = cmd;
   2377             psHciContext->tx_total = length;
   2378             psHciContext->response_pending = TRUE ;
   2379 
   2380             /* Send the Constructed HCP packet to the lower layer */
   2381             status = phHciNfc_Send_HCP( psHciContext, pHwRef );
   2382             p_pipe_info->prev_status = NFCSTATUS_PENDING;
   2383         }
   2384     }
   2385 
   2386     return status;
   2387 }
   2388 
   2389 
   2390 
   2391