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.c                                                           *
     22 * \brief HCI Interface Source for the HCI Management.                         *
     23 *                                                                             *
     24 *                                                                             *
     25 * Project: NFC-FRI-1.1                                                        *
     26 *                                                                             *
     27 * $Date: Thu Apr 22 17:49:47 2010 $                                           *
     28 * $Author: ing04880 $                                                         *
     29 * $Revision: 1.90 $                                                           *
     30 * $Aliases: NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
     31 *                                                                             *
     32 * =========================================================================== *
     33 */
     34 
     35 
     36 /*
     37 ################################################################################
     38 ***************************** Header File Inclusion ****************************
     39 ################################################################################
     40 */
     41 
     42 #include <phNfcConfig.h>
     43 #include <phNfcCompId.h>
     44 #include <phNfcIoctlCode.h>
     45 #include <phHciNfc.h>
     46 #include <phHciNfc_Sequence.h>
     47 #include <phHciNfc_RFReader.h>
     48 #include <phHciNfc_LinkMgmt.h>
     49 #ifdef ENABLE_P2P
     50 #include <phHciNfc_NfcIPMgmt.h>
     51 #endif
     52 #include <phHciNfc_Emulation.h>
     53 #include <phHciNfc_SWP.h>
     54 #include <phHciNfc_DevMgmt.h>
     55 #include <phOsalNfc.h>
     56 
     57 /**/
     58 
     59 /*
     60 *************************** Static Function Declaration **************************
     61 */
     62 
     63 
     64 static
     65 NFCSTATUS
     66 phHciNfc_Config_Emulation (
     67                         void                            *psHciHandle,
     68                         void                            *pHwRef,
     69                         phHal_sEmulationCfg_t           *pEmulationConfig
     70 
     71                         );
     72 
     73 
     74 /*
     75 *************************** Function Definitions **************************
     76 */
     77 
     78 
     79 /*!
     80  * \brief Initialises the HCI Interface
     81  *
     82  * This function initialises the resources for the HCI Command and
     83  * Response Mechanism
     84  */
     85 
     86  NFCSTATUS
     87  phHciNfc_Initialise (
     88                         void                            *psHciHandle,
     89                         void                            *pHwRef,
     90                         phHciNfc_Init_t                 init_mode,
     91                         phHal_sHwConfig_t               *pHwConfig,
     92                         pphNfcIF_Notification_CB_t       pHalNotify,
     93                         void                            *psContext,
     94                         phNfcLayer_sCfg_t               *psHciLayerCfg
     95                      )
     96 {
     97     phHciNfc_sContext_t *psHciContext = NULL;
     98     phNfcIF_sReference_t hciReference = { NULL, 0, 0 };
     99     phNfcIF_sCallBack_t  if_callback = { NULL, NULL, NULL, NULL };
    100     phNfc_sLowerIF_t    *plower_if = NULL;
    101     NFCSTATUS            status = NFCSTATUS_SUCCESS;
    102     uint8_t              lower_index=0;
    103 
    104     if( (NULL == psHciHandle) || (NULL == pHwRef) || (NULL == pHalNotify)
    105         || (NULL== psContext) || (NULL == psHciLayerCfg) || (NULL == pHwConfig)
    106     )
    107     {
    108         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    109     }
    110     else if ( NULL != *(phHciNfc_sContext_t **)psHciHandle )
    111     {
    112         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_ALREADY_INITIALISED );
    113     }
    114     else
    115     {
    116         /* Create the memory for HCI Context */
    117         psHciContext = (phHciNfc_sContext_t *)
    118                         phOsalNfc_GetMemory(sizeof(phHciNfc_sContext_t));
    119 
    120         if(psHciContext != NULL)
    121         {
    122             (void)memset((void *)psHciContext,0,
    123                                             sizeof(phHciNfc_sContext_t));
    124 
    125             psHciContext->hci_state.cur_state = hciState_Reset;
    126             psHciContext->hci_mode = hciMode_Reset;
    127             psHciContext->p_hw_ref = pHwRef;
    128             psHciContext->host_rf_type = phHal_eUnknown_DevType;
    129             HCI_PRINT("HCI Initialisation in Progress.... \n");
    130 
    131 #ifdef ESTABLISH_SESSION
    132             /*(void)memcpy(((phHal_sHwReference_t *)pHwRef)->session_id,
    133                 DEFAULT_SESSION, (sizeof(DEFAULT_SESSION) > 0x01) ?
    134                   sizeof(DEFAULT_SESSION):
    135                     sizeof(((phHal_sHwReference_t *)pHwRef)->session_id));*/
    136             (void)memcpy(pHwConfig->session_id,
    137                 DEFAULT_SESSION, ((sizeof(DEFAULT_SESSION) > 0x01)
    138                                     && (sizeof(DEFAULT_SESSION) <= 0x08 )) ?
    139                   sizeof(DEFAULT_SESSION):
    140                     sizeof(pHwConfig->session_id));
    141 #endif
    142             HCI_DEBUG("Sizeof Default Session %u\n",sizeof(DEFAULT_SESSION));
    143             psHciContext->p_upper_notify = pHalNotify;
    144             psHciContext->p_upper_context = psContext;
    145 
    146             if_callback.pif_ctxt = psHciContext ;
    147             if_callback.send_complete = &phHciNfc_Send_Complete;
    148             if_callback.receive_complete= &phHciNfc_Receive_Complete;
    149             if_callback.notify = &phHciNfc_Notify_Event;
    150             plower_if = hciReference.plower_if = &(psHciContext->lower_interface);
    151             *((phHciNfc_sContext_t **)psHciHandle) = psHciContext;
    152             psHciContext->init_mode = init_mode;
    153             psHciContext->p_hci_layer = psHciLayerCfg ;
    154             lower_index = psHciLayerCfg->layer_index - 1;
    155 
    156             if(NULL != psHciLayerCfg->layer_next->layer_registry)
    157             {
    158                 status = psHciLayerCfg->layer_next->layer_registry(
    159                                         &hciReference, if_callback,
    160                                         (void *)&psHciLayerCfg[lower_index]);
    161                 HCI_DEBUG("HCI Lower Layer Register, Status = %02X\n",status);
    162             }
    163             if( (NFCSTATUS_SUCCESS == status) && (NULL != plower_if->init) )
    164             {
    165                 status = phHciNfc_FSM_Update ( psHciContext,
    166                                         hciState_Initialise
    167                                         );
    168                 if(NFCSTATUS_SUCCESS == status)
    169                 {
    170                     psHciContext->hci_seq = ADMIN_INIT_SEQ;
    171                     psHciContext->target_release = FALSE;
    172                     psHciContext->config_type = POLL_LOOP_CFG;
    173                     psHciContext->p_config_params = pHwConfig ;
    174                     status = plower_if->init((void *)plower_if->pcontext,
    175                                             (void *)psHciContext->p_hw_ref);
    176                     HCI_DEBUG("HCI Lower Layer Initialisation, Status = %02X\n",status);
    177                     if( NFCSTATUS_PENDING != status )
    178                     {
    179                         /* Roll Back the State Machine to its Original State */
    180                         phHciNfc_FSM_Rollback ( psHciContext );
    181                     }
    182                 }
    183                 else
    184                 {
    185                     /* TODO: Handle Initialisation in the Invalid State */
    186                 }
    187             }/* End of Lower Layer Init */
    188         } /* End of Status Check for Memory */
    189         else
    190         {
    191             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
    192 
    193             HCI_PRINT("HCI Context Memory Allocation Failed\n");
    194         }
    195 
    196     }
    197     return status;
    198 }
    199 
    200 
    201 /*!
    202  * \brief Release of the HCI Interface .
    203  *
    204  * This function Closes all the open pipes and frees all the resources used by
    205  * HCI Layer
    206  */
    207 
    208  NFCSTATUS
    209  phHciNfc_Release (
    210                     void                            *psHciHandle,
    211                     void                            *pHwRef,
    212                     pphNfcIF_Notification_CB_t      pHalReleaseCB,
    213                     void                            *psContext
    214                   )
    215 {
    216     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    217     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    218 
    219     if( (NULL == psHciHandle)
    220         || (NULL == pHwRef)
    221         )
    222     {
    223         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    224     }
    225     /* This Scenario Forces the HCI and the lower layers
    226      * to release its Resources
    227      */
    228     else if ( NULL == pHalReleaseCB )
    229     {
    230         /* Release the lower layer Resources */
    231         phHciNfc_Release_Lower( psHciContext, pHwRef );
    232         /* Release the HCI layer Resources */
    233         phHciNfc_Release_Resources( &psHciContext );
    234     }
    235     else if ( NULL == psContext )
    236     {
    237         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    238     }
    239     else
    240     {
    241         HCI_PRINT("HCI Release in Progress.... \n");
    242         psHciContext->p_hw_ref = pHwRef;
    243         status = phHciNfc_FSM_Update ( psHciContext, hciState_Release );
    244         if ((NFCSTATUS_SUCCESS == status)
    245 #ifdef NXP_HCI_SHUTDOWN_OVERRIDE
    246             || (NFCSTATUS_INVALID_STATE == PHNFCSTATUS(status))
    247 #endif
    248             )
    249         {
    250             psHciContext->p_upper_notify = pHalReleaseCB;
    251             psHciContext->p_upper_context = psContext;
    252             /* psHciContext->hci_seq = EMULATION_REL_SEQ;*/
    253             /* psHciContext->hci_seq = READER_MGMT_REL_SEQ; */
    254             if (HCI_SELF_TEST != psHciContext->init_mode)
    255             {
    256                 psHciContext->hci_seq = PL_STOP_SEQ;
    257             }
    258             else
    259             {
    260                 psHciContext->hci_seq = ADMIN_REL_SEQ;
    261             }
    262 
    263 #ifdef NXP_HCI_SHUTDOWN_OVERRIDE
    264             if (NFCSTATUS_SUCCESS != status)
    265             {
    266                 psHciContext->hci_state.next_state = (uint8_t) hciState_Release;
    267                 status = NFCSTATUS_PENDING;
    268             }
    269             else
    270 #endif
    271             {
    272                 status = phHciNfc_Release_Sequence(psHciContext,pHwRef);
    273             }
    274 
    275             if( NFCSTATUS_PENDING != status )
    276             {
    277                 /* Roll Back the State Machine to its Original State */
    278                 phHciNfc_FSM_Rollback ( psHciContext );
    279             }
    280         }
    281         else
    282         {
    283             /* TODO: Return appropriate Error */
    284         }
    285 
    286     }
    287 
    288     return status;
    289 }
    290 
    291 #if 0
    292 /*!
    293  * \brief  Interface to Starts the RF Device Discovery.
    294  *
    295  * This function Starts the Discovery Wheel.
    296  */
    297 
    298 
    299  NFCSTATUS
    300  phHciNfc_Start_Discovery (
    301                         void                            *psHciHandle,
    302                         void                            *pHwRef
    303                      )
    304 {
    305     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    306     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    307 
    308     if ( (NULL == psHciHandle)
    309         || (NULL == pHwRef)
    310       )
    311     {
    312         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    313     }
    314     else
    315     {
    316         status = phHciNfc_ReaderMgmt_Enable_Discovery( psHciContext, pHwRef );
    317     }
    318 
    319     return status;
    320 }
    321 
    322 
    323 /*!
    324  * \brief  Interface to Stop the RF Device Discovery.
    325  *
    326  * This function Stops the Discovery Wheel.
    327  */
    328 
    329 
    330  NFCSTATUS
    331  phHciNfc_Stop_Discovery (
    332                         void                            *psHciHandle,
    333                         void                            *pHwRef
    334                      )
    335 {
    336     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    337     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    338 
    339     if ( (NULL == psHciHandle)
    340         || (NULL == pHwRef)
    341       )
    342     {
    343         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    344     }
    345     else
    346     {
    347         status = phHciNfc_ReaderMgmt_Disable_Discovery( psHciContext, pHwRef );
    348     }
    349 
    350     return status;
    351 }
    352 
    353 
    354 #endif
    355 
    356 /*!
    357  * \brief  Interface to Configure the Device With the appropriate
    358  * Configuration Parameters .
    359  *
    360  * This function configures the Devices with the provided
    361  * configuration attributes.
    362  */
    363 
    364 
    365  NFCSTATUS
    366  phHciNfc_Configure (
    367                         void                            *psHciHandle,
    368                         void                            *pHwRef,
    369                         phHal_eConfigType_t             config_type,
    370                         phHal_uConfig_t                 *pConfig
    371                      )
    372  {
    373     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    374 
    375     if( (NULL == psHciHandle)
    376         || (NULL == pHwRef)
    377         || (NULL == pConfig)
    378         )
    379     {
    380         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    381     }
    382     else
    383     {
    384         switch(config_type)
    385         {
    386             case NFC_P2P_CONFIG:
    387             {
    388 #ifdef ENABLE_P2P
    389                 phHciNfc_sContext_t  *psHciContext =
    390                             ((phHciNfc_sContext_t *)psHciHandle);
    391                 status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
    392 
    393                 if (NFCSTATUS_SUCCESS == status)
    394                 {
    395                     psHciContext->config_type = NFC_GENERAL_CFG;
    396                     psHciContext->p_config_params = &(pConfig->nfcIPConfig);
    397                     psHciContext->hci_seq = INITIATOR_GENERAL_SEQ;
    398                     status = phHciNfc_NfcIP_SetATRInfo( psHciHandle,
    399                                             pHwRef, NFCIP_INITIATOR,
    400                                                     &(pConfig->nfcIPConfig));
    401                     if( NFCSTATUS_PENDING != status )
    402                     {
    403                         /* Roll Back the State Machine to its Original State */
    404                         phHciNfc_FSM_Rollback ( psHciContext );
    405                     }
    406                     else
    407                     {
    408                         psHciContext->hci_seq = TARGET_GENERAL_SEQ;
    409                     }
    410                 }
    411 #else
    412                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    413 
    414 #endif
    415                 break;
    416             }
    417             case NFC_EMULATION_CONFIG:
    418             {
    419                 status = phHciNfc_Config_Emulation( psHciHandle,
    420                                             pHwRef, &(pConfig->emuConfig));
    421                 break;
    422             }
    423             case NFC_SE_PROTECTION_CONFIG:
    424             {
    425                 phHciNfc_sContext_t  *psHciContext =
    426                             ((phHciNfc_sContext_t *)psHciHandle);
    427                 status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
    428 
    429                 if (NFCSTATUS_SUCCESS == status)
    430                 {
    431                     psHciContext->config_type = SWP_PROTECT_CFG;
    432                     psHciContext->p_config_params = &(pConfig->protectionConfig);
    433                     psHciContext->hci_seq = HCI_END_SEQ;
    434                     status = phHciNfc_SWP_Protection( psHciHandle,
    435                                 pHwRef, pConfig->protectionConfig.mode);
    436                     if( NFCSTATUS_PENDING != status )
    437                     {
    438                         /* Roll Back the State Machine to its Original State */
    439                         phHciNfc_FSM_Rollback ( psHciContext );
    440                     }
    441                 }
    442                 break;
    443             }
    444             default:
    445             {
    446                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    447                 break;
    448             }
    449         }/* End of the Configuration Switch */
    450     }
    451 
    452     return status;
    453  }
    454 
    455 
    456 /*!
    457  * \brief  Interface to Configure the RF Device Discovery using
    458  * HCI Polling Loop Gate .
    459  *
    460  * This function configures the HCI Polling Loop Gate with the provided
    461  * configuration attributes.
    462  */
    463 
    464  NFCSTATUS
    465  phHciNfc_Config_Discovery (
    466                         void                            *psHciHandle,
    467                         void                            *pHwRef,
    468                         phHal_sADD_Cfg_t                *pPollConfig
    469                      )
    470 {
    471     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    472     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    473 
    474     if( (NULL == psHciHandle)
    475         || (NULL == pHwRef)
    476         || (NULL == pPollConfig)
    477         )
    478     {
    479         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    480     }
    481     else
    482     {
    483         psHciContext->p_hw_ref = pHwRef;
    484         HCI_PRINT("HCI Poll Configuration .... \n");
    485         status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
    486 
    487         if (NFCSTATUS_SUCCESS == status)
    488         {
    489 #if 0
    490             if(pPollConfig->PollDevInfo.PollEnabled)
    491             {
    492                 psHciContext->hci_seq = PL_DURATION_SEQ;
    493             }
    494             else
    495             {
    496                 psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;
    497                 /* psHciContext->hci_seq = (pPollConfig->NfcIP_Mode != 0 )?
    498                                                     PL_CONFIG_PHASE_SEQ:
    499                                                         READER_DISABLE_SEQ; */
    500             }
    501 #endif
    502             psHciContext->hci_seq = PL_DURATION_SEQ;
    503             psHciContext->config_type = POLL_LOOP_CFG;
    504             psHciContext->p_config_params = pPollConfig;
    505             status = phHciNfc_PollLoop_Sequence( psHciContext, pHwRef );
    506 
    507             if( NFCSTATUS_PENDING != status )
    508             {
    509                 /* Roll Back the State Machine to its Original State */
    510                 phHciNfc_FSM_Rollback ( psHciContext );
    511             }
    512         }
    513         else
    514         {
    515             /* TODO: Return appropriate Error */
    516         }
    517     }
    518     return status;
    519 }
    520 
    521 /*!
    522  * \brief  Interface to Restart the RF Device Discovery.
    523  *
    524  * This function restarts the Discovery Wheel.
    525  */
    526 
    527 
    528  NFCSTATUS
    529  phHciNfc_Restart_Discovery (
    530                         void                            *psHciHandle,
    531                         void                            *pHwRef,
    532                         uint8_t                         re_poll
    533                      )
    534 {
    535     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    536     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    537     phHal_eRemDevType_t     target_type = phHal_eUnknown_DevType;
    538 
    539     if ( (NULL == psHciHandle)
    540         || (NULL == pHwRef)
    541       )
    542     {
    543         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    544     }
    545     else
    546     {
    547         psHciContext->p_hw_ref = pHwRef;
    548 
    549         /* To be back in the Poll State to Re-Poll the Target */
    550         status = phHciNfc_FSM_Update ( psHciContext, hciState_Initialise );
    551         if (NFCSTATUS_SUCCESS == status)
    552         {
    553             switch (psHciContext->host_rf_type)
    554             {
    555                 case phHal_eISO14443_A_PCD:
    556                 {
    557                     target_type = phHal_eISO14443_A_PICC;
    558                     break;
    559                 }
    560                 case phHal_eNfcIP1_Initiator:
    561                 {
    562                     target_type = phHal_eNfcIP1_Target;
    563                     break;
    564                 }
    565 #ifdef TYPE_B
    566                 case phHal_eISO14443_B_PCD:
    567                 {
    568                     target_type = phHal_eISO14443_B_PICC;
    569                     break;
    570                 }
    571 #endif
    572 #ifdef TYPE_FELICA
    573                 case phHal_eFelica_PCD:
    574                 {
    575                     target_type = phHal_eFelica_PICC;
    576                     break;
    577                 }
    578 #endif
    579 #ifdef TYPE_JEWEL
    580                 case phHal_eJewel_PCD:
    581                 {
    582                     target_type = phHal_eJewel_PICC;
    583                     break;
    584                 }
    585 #endif
    586 #ifdef  TYPE_ISO15693
    587                 case phHal_eISO15693_PCD:
    588                 {
    589                     target_type = phHal_eISO15693_PICC;
    590                     break;
    591                 }
    592 #endif /* #ifdef    TYPE_ISO15693 */
    593 #ifndef TYPE_B
    594                 case phHal_eISO14443_B_PCD:
    595 #endif
    596 #ifndef TYPE_FELICA
    597                 case phHal_eFelica_PCD:
    598 #endif
    599 #ifndef TYPE_JEWEL
    600                 case phHal_eJewel_PCD:
    601 #endif
    602 #ifndef TYPE_B_PRIME
    603                 case phHal_eISO14443_BPrime_PCD:
    604 #endif
    605                 {
    606                     /* Roll Back the State Machine to its Original State */
    607                     phHciNfc_FSM_Rollback ( psHciContext );
    608                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    609                     break;
    610                 }
    611                 case phHal_eUnknown_DevType:
    612                 default:
    613                 {
    614                     /* Roll Back the State Machine to its Original State */
    615                     phHciNfc_FSM_Rollback ( psHciContext );
    616                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    617                     break;
    618                 }
    619             }/* End of the Remote Target Type Switch */
    620             if( NFCSTATUS_SUCCESS == status )
    621             {
    622                 status = phHciNfc_ReaderMgmt_Deselect(
    623                     psHciContext, pHwRef, target_type, re_poll);
    624                 if( NFCSTATUS_PENDING != status )
    625                 {
    626                     /* Roll Back the State Machine to its Original State */
    627                     phHciNfc_FSM_Rollback ( psHciContext );
    628                 }
    629                 else
    630                 {
    631                     psHciContext->host_rf_type = phHal_eUnknown_DevType;
    632                 }
    633             }
    634         }
    635         else
    636         {
    637             /* TODO: Return appropriate Error */
    638         }
    639     }
    640 
    641     return status;
    642 }
    643 
    644 
    645 
    646 /*!
    647  * \brief  Interface to Configure the device to emulation as
    648  * the tag, smart tag or p2p target .
    649  *
    650  * This function configures the HCI Polling Loop Gate with the provided
    651  * configuration attributes.
    652  */
    653 
    654  static
    655  NFCSTATUS
    656  phHciNfc_Config_Emulation (
    657                         void                            *psHciHandle,
    658                         void                            *pHwRef,
    659                         phHal_sEmulationCfg_t           *pEmulationCfg
    660                      )
    661 {
    662     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    663     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    664 
    665     if( (NULL == psHciHandle)
    666         || (NULL == pHwRef)
    667         || (NULL == pEmulationCfg)
    668         )
    669     {
    670         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    671     }
    672     else
    673     {
    674         psHciContext->p_hw_ref = pHwRef;
    675 
    676         HCI_PRINT("HCI Configure Emulation .... \n");
    677         status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
    678 
    679         if (NFCSTATUS_SUCCESS == status)
    680         {
    681             psHciContext->hci_seq = EMULATION_CONFIG_SEQ;
    682             psHciContext->p_config_params = pEmulationCfg;
    683             switch( pEmulationCfg->emuType )
    684             {
    685                 case NFC_SMARTMX_EMULATION:
    686                 {
    687                     psHciContext->config_type = SMX_WI_CFG;
    688                     status = phHciNfc_Emulation_Cfg(psHciContext,
    689                                 pHwRef, SMX_WI_CFG);
    690                     break;
    691                 }
    692                 case NFC_UICC_EMULATION:
    693                 {
    694                     psHciContext->config_type = UICC_SWP_CFG;
    695                     psHciContext->hci_seq = EMULATION_CONFIG_SEQ;
    696                     (void)phHciNfc_SWP_Update_Sequence(
    697                                         psHciContext, CONFIG_SEQ );
    698                     status = phHciNfc_EmulationCfg_Sequence(
    699                                                 psHciContext, pHwRef);
    700                     break;
    701                 }
    702                 case NFC_HOST_CE_A_EMULATION:
    703                 case NFC_HOST_CE_B_EMULATION:
    704 #if defined(HOST_EMULATION)
    705                 {
    706                     if(TRUE == pEmulationCfg->config.
    707                         hostEmuCfg_A.enableEmulation)
    708                     {
    709                         psHciContext->hci_seq = ADMIN_CE_SEQ;
    710                     }
    711                     status = phHciNfc_EmulationCfg_Sequence(
    712                                                 psHciContext, pHwRef);
    713                     break;
    714                 }
    715 #endif
    716                 default:
    717                 {
    718                     break;
    719                 }
    720 
    721             } /* End of Config Switch */
    722             if( NFCSTATUS_PENDING != status )
    723             {
    724                 /* Roll Back the State Machine to its Original State */
    725                 phHciNfc_FSM_Rollback ( psHciContext );
    726             }
    727         }
    728         else
    729         {
    730             /* TODO: Return appropriate Error */
    731         }
    732     }
    733 
    734     return status;
    735 }
    736 
    737  NFCSTATUS
    738  phHciNfc_Switch_SwpMode (
    739                         void                            *psHciHandle,
    740                         void                            *pHwRef,
    741                         phHal_eSWP_Mode_t               swp_mode /* ,
    742                         void                            *pSwpCfg */
    743                      )
    744 {
    745     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    746     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    747 
    748     if( (NULL == psHciHandle)
    749         || (NULL == pHwRef)
    750         )
    751     {
    752         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    753     }
    754     else
    755     {
    756         psHciContext->p_hw_ref = pHwRef;
    757 
    758         HCI_PRINT("HCI SWP Switch .... ");
    759         status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
    760         if (NFCSTATUS_SUCCESS == status)
    761         {
    762             psHciContext->config_type = SWP_EVT_CFG;
    763             status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef ,
    764                                                        (uint8_t) swp_mode );
    765 
    766             /* Send the Success Status as this is an event */
    767             status = ((status == NFCSTATUS_SUCCESS)?
    768                     NFCSTATUS_PENDING : status);
    769 
    770             if( NFCSTATUS_PENDING != status )
    771             {
    772                 /* Roll Back the State Machine to its Original State */
    773                 phHciNfc_FSM_Rollback ( psHciContext );
    774 
    775                 HCI_PRINT(" Execution Error \n");
    776             }
    777             else
    778             {
    779                 HCI_PRINT(" Successful \n");
    780             }
    781         }
    782         else
    783         {
    784             HCI_PRINT(" Not allowed - Invalid State \n");
    785             /* TODO: Return appropriate Error */
    786         }
    787     }
    788 
    789     return status;
    790 }
    791 
    792 
    793 
    794 /*!
    795  * \brief  Interface to Switch the Mode of the SmartMx from Virtual/Wired
    796  * to the other mode.
    797  *
    798  * This function switches the mode of the SmartMX connected through WI(S2C)
    799  * Interface to virtual/wired mode.
    800  */
    801 
    802 
    803  NFCSTATUS
    804  phHciNfc_Switch_SmxMode (
    805                         void                            *psHciHandle,
    806                         void                            *pHwRef,
    807                         phHal_eSmartMX_Mode_t           smx_mode,
    808                         phHal_sADD_Cfg_t                *pPollConfig
    809                     )
    810 {
    811     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    812     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    813 
    814     if( (NULL == psHciHandle)
    815         || (NULL == pHwRef)
    816         || (NULL == pPollConfig)
    817         )
    818     {
    819         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    820     }
    821     else
    822     {
    823         psHciContext->p_hw_ref = pHwRef;
    824 
    825         HCI_PRINT("HCI Smart MX Mode Switch .... \n");
    826         status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
    827 
    828         if (NFCSTATUS_SUCCESS == status)
    829         {
    830             psHciContext->hci_seq = READER_DISABLE_SEQ;
    831             if ( (eSmartMx_Wired == psHciContext->smx_mode)
    832                 && ( hciState_Connect == psHciContext->hci_state.cur_state)
    833                 &&( eSmartMx_Wired != smx_mode)
    834                 )
    835             {
    836                 /* Workaround: For Wired Mode Disconnect
    837                    All the statemachine updates should be done only with the
    838                    Statemachine API and should not be overridden.
    839                  */
    840                  psHciContext->hci_state.cur_state = hciState_Disconnect;
    841             }
    842             psHciContext->config_type = SMX_WI_MODE;
    843             psHciContext->smx_mode = smx_mode;
    844             psHciContext->p_config_params = pPollConfig;
    845             status = phHciNfc_SmartMx_Mode_Sequence( psHciContext, pHwRef );
    846             if( NFCSTATUS_PENDING != status )
    847             {
    848                 /* Roll Back the State Machine to its Original State */
    849                 phHciNfc_FSM_Rollback ( psHciContext );
    850             }
    851         }
    852         else
    853         {
    854             /* TODO: Return appropriate Error */
    855         }
    856     }
    857 
    858     return status;
    859 }
    860 
    861 
    862 /*!
    863  * \brief  Interface to Select the Next Remote Target Discovered during the
    864  * discovery sequence using the particular HCI Reader Gate .
    865  *
    866  *
    867  * This function Selects and Activates the next Remote Target
    868  * Detected using the particular HCI Reader Gate.
    869  */
    870 
    871 
    872 
    873 NFCSTATUS
    874 phHciNfc_Select_Next_Target (
    875                     void                            *psHciHandle,
    876                     void                            *pHwRef
    877                     )
    878 {
    879     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    880     NFCSTATUS            status = NFCSTATUS_SUCCESS;
    881 
    882     if( (NULL == psHciHandle)
    883         || (NULL == pHwRef)
    884         )
    885     {
    886         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    887     }
    888     else
    889     {
    890         psHciContext->p_hw_ref = pHwRef;
    891         status = phHciNfc_FSM_Update ( psHciContext, hciState_Select );
    892         if (NFCSTATUS_SUCCESS == status)
    893         {
    894             psHciContext->hci_seq = READER_SELECT_SEQ;
    895             status = phHciNfc_ReaderMgmt_Activate_Next( psHciContext, pHwRef );
    896             if( NFCSTATUS_PENDING != status )
    897             {
    898                 /* Roll Back the State Machine to its Original State */
    899                 phHciNfc_FSM_Rollback ( psHciContext );
    900             }
    901         }
    902         else
    903         {
    904             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
    905         }
    906     }
    907 
    908     return status;
    909 
    910 }
    911 
    912 
    913 /*!
    914  * \brief  Interface to Connect the Remote Target Discovered during the
    915  * discovery sequence using the particular HCI Reader Gate .
    916  *
    917  *
    918  * This function connects the Remote Target Detected using the particular
    919  * HCI Reader Gate with the appropriate configuration setup.
    920  */
    921 
    922 
    923  NFCSTATUS
    924  phHciNfc_Connect (
    925                     void                            *psHciHandle,
    926                     void                            *pHwRef,
    927                     phHal_sRemoteDevInformation_t   *p_target_info
    928                  )
    929  {
    930     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    931     NFCSTATUS            status = NFCSTATUS_SUCCESS;
    932     /* phHal_eRemDevType_t  target_type = phHal_eUnknown_DevType; */
    933 
    934     if( (NULL == psHciHandle)
    935         || (NULL == pHwRef)
    936         || (NULL == p_target_info)
    937         )
    938     {
    939         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    940     }
    941     else
    942     {
    943         psHciContext->p_hw_ref = pHwRef;
    944         status = phHciNfc_FSM_Update ( psHciContext, hciState_Connect );
    945         if (NFCSTATUS_SUCCESS == status)
    946         {
    947             psHciContext->hci_seq = READER_SELECT_SEQ;
    948             switch (p_target_info->RemDevType)
    949             {
    950                 case phHal_eISO14443_A_PICC:
    951                 case phHal_eISO14443_4A_PICC:
    952                 case phHal_eMifare_PICC:
    953                 case phHal_eISO14443_3A_PICC:
    954 #ifdef ENABLE_P2P
    955                 case phHal_eNfcIP1_Target:
    956 #endif
    957 #ifdef TYPE_B
    958                 case phHal_eISO14443_B_PICC:
    959                 case phHal_eISO14443_4B_PICC:
    960 #endif
    961 #ifdef TYPE_FELICA
    962                 case phHal_eFelica_PICC:
    963 #endif
    964 #ifdef TYPE_JEWEL
    965                 case phHal_eJewel_PICC:
    966 #endif
    967 #ifdef  TYPE_ISO15693
    968                 case phHal_eISO15693_PICC:
    969 #endif /* #ifdef    TYPE_ISO15693 */
    970 
    971                 {
    972                     psHciContext->p_target_info = p_target_info;
    973                     status = phHciNfc_ReaderMgmt_Select(
    974                                     psHciContext, pHwRef,
    975                                     p_target_info->RemDevType );
    976                     break;
    977                 }
    978 #ifndef TYPE_B_PRIME
    979                 case phHal_eISO14443_BPrime_PICC:
    980 #endif
    981                 case phHal_eUnknown_DevType:
    982                 default:
    983                 {
    984                     /* Roll Back the State Machine to its Original State */
    985                     phHciNfc_FSM_Rollback ( psHciContext );
    986                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    987                     break;
    988                 }
    989             }/* End of the Remote Target Type Switch */
    990             if( NFCSTATUS_PENDING != status )
    991             {
    992                 /* Roll Back the State Machine to its Original State */
    993                 phHciNfc_FSM_Rollback ( psHciContext );
    994             }
    995         }
    996         else
    997         {
    998             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
    999         }
   1000 
   1001     } /* End of the HCI Handle Validation */
   1002 
   1003     return status;
   1004 }
   1005 
   1006 
   1007 /*!
   1008  * \brief  Interface to Reactivate the Remote Targets Discovered during the
   1009  * discovery sequence using the particular HCI Reader Gate .
   1010  *
   1011  *
   1012  * This function reactivates the Remote Target Detected using the particular
   1013  * HCI Reader Gate with the appropriate configuration setup.
   1014  */
   1015 
   1016 
   1017  NFCSTATUS
   1018  phHciNfc_Reactivate (
   1019                     void                            *psHciHandle,
   1020                     void                            *pHwRef,
   1021                     phHal_sRemoteDevInformation_t   *p_target_info
   1022                  )
   1023  {
   1024     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
   1025     NFCSTATUS            status = NFCSTATUS_SUCCESS;
   1026     /* phHal_eRemDevType_t  target_type = phHal_eUnknown_DevType; */
   1027 
   1028     if( (NULL == psHciHandle)
   1029         || (NULL == pHwRef)
   1030         || (NULL == p_target_info)
   1031         )
   1032     {
   1033         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1034     }
   1035     else
   1036     {
   1037         psHciContext->p_hw_ref = pHwRef;
   1038         status = phHciNfc_FSM_Update ( psHciContext, hciState_Reactivate );
   1039         if (NFCSTATUS_SUCCESS == status)
   1040         {
   1041             psHciContext->hci_seq = READER_REACTIVATE_SEQ;
   1042             switch (p_target_info->RemDevType)
   1043             {
   1044                 case phHal_eISO14443_A_PICC:
   1045                 case phHal_eISO14443_4A_PICC:
   1046                 case phHal_eMifare_PICC:
   1047                 case phHal_eISO14443_3A_PICC:
   1048                 {
   1049                     psHciContext->host_rf_type = phHal_eISO14443_A_PCD;
   1050                     break;
   1051                 }
   1052                 case phHal_eNfcIP1_Target:
   1053                 {
   1054                     psHciContext->host_rf_type = phHal_eNfcIP1_Initiator;
   1055                     break;
   1056                 }
   1057 #ifdef TYPE_B
   1058                 case phHal_eISO14443_4B_PICC:
   1059                 case phHal_eISO14443_B_PICC:
   1060                 {
   1061                     psHciContext->host_rf_type = phHal_eISO14443_B_PCD;
   1062                     break;
   1063                 }
   1064 #endif
   1065 #ifdef TYPE_FELICA
   1066                 case phHal_eFelica_PICC:
   1067                 {
   1068                     psHciContext->host_rf_type = phHal_eFelica_PCD;
   1069                     break;
   1070                 }
   1071 #endif
   1072 #ifdef TYPE_B_PRIME
   1073                 case phHal_eISO14443_BPrime_PICC:
   1074 #endif
   1075                     /* Reactivate for Jewel is not Supported */
   1076                 case phHal_eJewel_PICC:
   1077                 case phHal_eUnknown_DevType:
   1078                 default:
   1079                 {
   1080                     /* Roll Back the State Machine to its Original State */
   1081                     phHciNfc_FSM_Rollback ( psHciContext );
   1082                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1083                     break;
   1084                 }
   1085             }/* End of the Remote Target Type Switch */
   1086         }
   1087         else
   1088         {
   1089             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
   1090         }
   1091 
   1092         if(NFCSTATUS_SUCCESS == status )
   1093         {
   1094             psHciContext->p_target_info = p_target_info;
   1095             status = phHciNfc_ReaderMgmt_Reactivate(
   1096                             psHciContext, pHwRef, p_target_info->RemDevType );
   1097             if( NFCSTATUS_PENDING != status )
   1098             {
   1099                 /* Roll Back the State Machine to its Original State */
   1100                 phHciNfc_FSM_Rollback ( psHciContext );
   1101             }
   1102         }
   1103     } /* End of the HCI Handle Validation */
   1104 
   1105 
   1106     return status;
   1107 }
   1108 
   1109 
   1110 /*!
   1111  * \brief  Interface to Disconnect the selected target.
   1112  *
   1113  * This function disconnects the remote target selected.
   1114  */
   1115 
   1116 
   1117  NFCSTATUS
   1118  phHciNfc_Disconnect (
   1119                     void                            *psHciHandle,
   1120                     void                            *pHwRef,
   1121                     uint8_t                         re_poll
   1122                  )
   1123  {
   1124     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
   1125     NFCSTATUS            status = NFCSTATUS_SUCCESS;
   1126     phHal_eRemDevType_t  target_type = phHal_eUnknown_DevType;
   1127     /* phHal_eSmartMX_Mode_t smx_mode = (phHal_eSmartMX_Mode_t)type; */
   1128     static  uint8_t      repoll=0;
   1129 
   1130 
   1131     if( (NULL == psHciHandle)
   1132         || (NULL == pHwRef)
   1133         || ( NULL == psHciContext->p_target_info)
   1134     )
   1135     {
   1136         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1137     }
   1138     else
   1139     {
   1140         psHciContext->p_hw_ref = pHwRef;
   1141         repoll = re_poll;
   1142         psHciContext->p_config_params = &repoll;
   1143         /* psHciContext->hci_seq = HCI_END_SEQ; */
   1144 
   1145         /* To be back in the Poll State to Re-Poll the Target */
   1146         status = phHciNfc_FSM_Update ( psHciContext, hciState_Disconnect );
   1147         if (NFCSTATUS_SUCCESS == status)
   1148         {
   1149             psHciContext->hci_seq = READER_UICC_DISPATCH_SEQ;
   1150             target_type = psHciContext->p_target_info->RemDevType;
   1151             switch (target_type)
   1152             {
   1153                 case phHal_eMifare_PICC:
   1154                 case phHal_eISO14443_A_PICC:
   1155                 case phHal_eISO14443_4A_PICC:
   1156                 case phHal_eISO14443_3A_PICC:
   1157                 case phHal_eNfcIP1_Target:
   1158 #ifdef TYPE_B
   1159                 case phHal_eISO14443_B_PICC:
   1160                 case phHal_eISO14443_4B_PICC:
   1161 #endif
   1162 #ifdef TYPE_FELICA
   1163                 case phHal_eFelica_PICC:
   1164 #endif
   1165 #ifdef TYPE_JEWEL
   1166                 case phHal_eJewel_PICC:
   1167 #endif
   1168 #ifdef  TYPE_ISO15693
   1169                 case phHal_eISO15693_PICC:
   1170 #endif /* #ifdef    TYPE_ISO15693 */
   1171 
   1172                 {
   1173                     status = phHciNfc_Disconnect_Sequence(
   1174                                     psHciContext, pHwRef );
   1175                     break;
   1176                 }
   1177 #ifndef TYPE_B
   1178                 case phHal_eISO14443_B_PICC:
   1179                 case phHal_eISO14443_4B_PICC:
   1180 #endif
   1181 #ifndef TYPE_FELICA
   1182                 case phHal_eFelica_PICC:
   1183 #endif
   1184 #ifndef TYPE_JEWEL
   1185                 case phHal_eJewel_PICC:
   1186 #endif
   1187 #ifndef TYPE_B_PRIME
   1188                 case phHal_eISO14443_BPrime_PICC:
   1189 #endif
   1190                 {
   1191                     /* Roll Back the State Machine to its Original State */
   1192                     phHciNfc_FSM_Rollback ( psHciContext );
   1193                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1194                     break;
   1195                 }
   1196                 case phHal_eUnknown_DevType:
   1197                 default:
   1198                 {
   1199                     /* Roll Back the State Machine to its Original State */
   1200                     phHciNfc_FSM_Rollback ( psHciContext );
   1201                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1202                     break;
   1203                 }
   1204             }/* End of the Remote Target Type Switch */
   1205             if( NFCSTATUS_PENDING != status )
   1206             {
   1207                 /* Roll Back the State Machine to its Original State */
   1208                 phHciNfc_FSM_Rollback ( psHciContext );
   1209             }
   1210         }
   1211         else
   1212         {
   1213             /* TODO: Return appropriate Error */
   1214         }
   1215     } /* End of the HCI Handle Validation */
   1216 
   1217     return status;
   1218 }
   1219 
   1220 /*!
   1221  * \brief  Interface to exchange the data to/from
   1222  * the selected target.
   1223  *
   1224  * This function sends and receives the data to/from
   1225  * the selected remote target.
   1226  */
   1227 
   1228  NFCSTATUS
   1229  phHciNfc_Exchange_Data (
   1230                     void                            *psHciHandle,
   1231                     void                            *pHwRef,
   1232                     phHal_sRemoteDevInformation_t   *p_target_info,
   1233                     phHciNfc_XchgInfo_t             *p_xchg_info
   1234                  )
   1235  {
   1236     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
   1237     NFCSTATUS   status = NFCSTATUS_SUCCESS;
   1238 
   1239     if( (NULL == psHciHandle)
   1240         || (NULL == pHwRef)
   1241         || (NULL == p_target_info)
   1242         || (NULL == p_xchg_info)
   1243         )
   1244     {
   1245         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1246     }
   1247     else if (p_target_info != psHciContext->p_target_info )
   1248     {
   1249         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_REMOTE_DEVICE);
   1250     }
   1251     else
   1252     {
   1253         psHciContext->p_hw_ref = pHwRef;
   1254         status = phHciNfc_FSM_Update ( psHciContext, hciState_Transact );
   1255         if (NFCSTATUS_SUCCESS == status)
   1256         {
   1257             switch (p_target_info->RemDevType)
   1258             {
   1259                 case phHal_eMifare_PICC:
   1260                 case phHal_eISO14443_A_PICC:
   1261                 case phHal_eISO14443_4A_PICC:
   1262                 case phHal_eISO14443_3A_PICC:
   1263 #ifdef TYPE_B
   1264                 case phHal_eISO14443_B_PICC:
   1265                 case phHal_eISO14443_4B_PICC:
   1266 #endif
   1267 #ifdef TYPE_FELICA
   1268                 case phHal_eFelica_PICC:
   1269 #endif
   1270 #ifdef TYPE_JEWEL
   1271                 case phHal_eJewel_PICC:
   1272 #endif
   1273 #ifdef  TYPE_ISO15693
   1274                 case phHal_eISO15693_PICC:
   1275 #endif /* #ifdef    TYPE_ISO15693 */
   1276                 {
   1277                     psHciContext->p_xchg_info = p_xchg_info;
   1278                     status = phHciNfc_ReaderMgmt_Exchange_Data(
   1279                                     psHciContext, pHwRef, p_xchg_info );
   1280                     break;
   1281                 }
   1282 #ifndef TYPE_B
   1283                 case phHal_eISO14443_B_PICC:
   1284                 case phHal_eISO14443_4B_PICC:
   1285 #endif
   1286 #ifndef TYPE_FELICA
   1287                 case phHal_eFelica_PICC:
   1288 #endif
   1289 #ifndef TYPE_JEWEL
   1290                 case phHal_eJewel_PICC:
   1291 #endif
   1292                 case phHal_eNfcIP1_Target:
   1293 #ifndef TYPE_B_PRIME
   1294                 case phHal_eISO14443_BPrime_PICC:
   1295 #endif
   1296                 {
   1297                     /* Roll Back the State Machine to its Original State */
   1298                     phHciNfc_FSM_Rollback ( psHciContext );
   1299                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1300                     break;
   1301                 }
   1302                 case phHal_eUnknown_DevType:
   1303                 default:
   1304                 {
   1305                     /* Roll Back the State Machine to its Original State */
   1306                     phHciNfc_FSM_Rollback ( psHciContext );
   1307                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1308                     break;
   1309                 }
   1310 
   1311             }/* End of the Remote Target Type Switch */
   1312             if( NFCSTATUS_PENDING != status )
   1313             {
   1314                 /* Roll Back the State Machine to its Original State */
   1315                 phHciNfc_FSM_Rollback ( psHciContext );
   1316             }
   1317         }
   1318         else
   1319         {
   1320             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
   1321         }
   1322     } /* End of the HCI Handle Validation */
   1323 
   1324     return status;
   1325 }
   1326 
   1327 /*!
   1328  * \brief  Interface to Send the data to/from
   1329  * the selected NfcIP.
   1330  *
   1331  * This function sends and receives the data to/from
   1332  * the selected remote target.
   1333  */
   1334 
   1335  NFCSTATUS
   1336  phHciNfc_Send_Data (
   1337                     void                            *psHciHandle,
   1338                     void                            *pHwRef,
   1339                     phHal_sRemoteDevInformation_t   *p_remote_dev_info,
   1340                     phHciNfc_XchgInfo_t             *p_send_param
   1341                  )
   1342  {
   1343     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
   1344     NFCSTATUS   status = NFCSTATUS_SUCCESS;
   1345 
   1346     if( (NULL == psHciHandle)
   1347         || (NULL == pHwRef)
   1348         || (NULL == p_send_param)
   1349         )
   1350     {
   1351         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1352     }
   1353     else
   1354     {
   1355         psHciContext->p_hw_ref = pHwRef;
   1356         status = phHciNfc_FSM_Update ( psHciContext, hciState_Transact );
   1357         if (NFCSTATUS_SUCCESS == status)
   1358         {
   1359             switch (psHciContext->host_rf_type)
   1360             {
   1361                 case phHal_eISO14443_A_PICC:
   1362                 case phHal_eISO14443_B_PICC:
   1363                 case phHal_eISO14443_4A_PICC:
   1364                 case phHal_eISO14443_4B_PICC:
   1365                 {
   1366                     break;
   1367                 }
   1368 #ifdef ENABLE_P2P
   1369                 case phHal_eNfcIP1_Initiator:
   1370                 {
   1371                     if (p_remote_dev_info !=
   1372                                     psHciContext->p_target_info )
   1373                     {
   1374                         status = PHNFCSTVAL(CID_NFC_HCI,
   1375                                         NFCSTATUS_INVALID_REMOTE_DEVICE);
   1376                     }
   1377                     else
   1378                     {
   1379                         psHciContext->p_xchg_info = p_send_param;
   1380                         status = phHciNfc_NfcIP_Send_Data( psHciContext,
   1381                                                     pHwRef, p_send_param );
   1382                     }
   1383                     break;
   1384                 }
   1385                 case phHal_eNfcIP1_Target:
   1386                 {
   1387                     psHciContext->p_xchg_info = p_send_param;
   1388                     status = phHciNfc_NfcIP_Send_Data( psHciContext,
   1389                                                 pHwRef, p_send_param );
   1390                     break;
   1391                 }
   1392 #endif
   1393 #ifdef TYPE_B_PRIME
   1394                 case phHal_eISO14443_BPrime_PCD:
   1395                 case phHal_eFelica_PCD:
   1396                 {
   1397                     /* Roll Back the State Machine to its Original State */
   1398                     phHciNfc_FSM_Rollback ( psHciContext );
   1399                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1400                     break;
   1401                 }
   1402 #endif
   1403                 case phHal_eUnknown_DevType:
   1404                 default:
   1405                 {
   1406                     /* Roll Back the State Machine to its Original State */
   1407                     phHciNfc_FSM_Rollback ( psHciContext );
   1408                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1409                     break;
   1410                 }
   1411 
   1412             }/* End of the Remote Target Type Switch */
   1413 #if defined( ENABLE_P2P ) || defined (TYPE_B_PRIME)
   1414             if( NFCSTATUS_PENDING != status )
   1415 #endif
   1416             {
   1417                 /* Roll Back the State Machine to its Original State */
   1418                 phHciNfc_FSM_Rollback ( psHciContext );
   1419             }
   1420         }
   1421         else
   1422         {
   1423             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
   1424         }
   1425     } /* End of the HCI Handle Validation */
   1426 
   1427     return status;
   1428 
   1429  }
   1430 
   1431 #if 0
   1432 
   1433 /*!
   1434  * \brief  Interface to Send the data from
   1435  * the selected NfcIP.
   1436  *
   1437  * This function sends and receives the data to/from
   1438  * the selected remote target.
   1439  */
   1440 
   1441  NFCSTATUS
   1442  phHciNfc_Receive_Data (
   1443                     void                            *psHciHandle,
   1444                     void                            *pHwRef,
   1445                     uint8_t                         *p_data,
   1446                     uint8_t                         length
   1447                  )
   1448  {
   1449     phHciNfc_sContext_t  *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
   1450     NFCSTATUS   status = NFCSTATUS_SUCCESS;
   1451 
   1452     if( (NULL == psHciHandle)
   1453         || (NULL == pHwRef)
   1454         )
   1455     {
   1456         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1457     }
   1458     else
   1459     {
   1460         if (NFCSTATUS_SUCCESS == status)
   1461         {
   1462             status = phHciNfc_Receive(psHciHandle, pHwRef, p_data, length);
   1463             if( NFCSTATUS_PENDING != status )
   1464             {
   1465                 /* Roll Back the State Machine to its Original State */
   1466                 phHciNfc_FSM_Rollback ( psHciContext );
   1467             }
   1468         }
   1469     }
   1470     return status;
   1471 
   1472  }
   1473 
   1474 #endif
   1475 
   1476  /*!
   1477  * \brief  Interface to Check for the presence of
   1478  * the selected target in the field .
   1479  *
   1480  * This function checks the presence of the
   1481  * the selected remote target in the field .
   1482  */
   1483 
   1484 
   1485 
   1486 NFCSTATUS
   1487 phHciNfc_Presence_Check (
   1488                     void                            *psHciHandle,
   1489                     void                            *pHwRef
   1490                     )
   1491 {
   1492     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1493     phHciNfc_sContext_t     *psHciContext =
   1494                             ((phHciNfc_sContext_t *)psHciHandle);
   1495     phHal_eRemDevType_t     target_type = phHal_eUnknown_DevType;
   1496 
   1497     if( (NULL == psHciContext)
   1498         || (NULL == pHwRef)
   1499         )
   1500     {
   1501         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1502     }
   1503     else
   1504     {
   1505         psHciContext->p_hw_ref = pHwRef;
   1506         status = phHciNfc_FSM_Update ( psHciContext, hciState_Presence );
   1507         if (NFCSTATUS_SUCCESS == status)
   1508         {
   1509             target_type = psHciContext->p_target_info->RemDevType;
   1510             switch (target_type)
   1511             {
   1512                 case phHal_eISO14443_A_PICC:
   1513                 case phHal_eMifare_PICC:
   1514                 case phHal_eISO14443_4A_PICC:
   1515                 case phHal_eISO14443_3A_PICC:
   1516 #ifdef TYPE_B
   1517                 case phHal_eISO14443_B_PICC:
   1518                 case phHal_eISO14443_4B_PICC:
   1519 #endif
   1520 #ifdef TYPE_FELICA
   1521                 case phHal_eFelica_PICC:
   1522 #endif
   1523 #ifdef TYPE_JEWEL
   1524                 case phHal_eJewel_PICC:
   1525 #endif
   1526 #ifdef  TYPE_ISO15693
   1527                 case phHal_eISO15693_PICC:
   1528 #endif /* #ifdef    TYPE_ISO15693 */
   1529 #ifdef ENABLE_P2P
   1530                 case phHal_eNfcIP1_Target:
   1531 #endif
   1532                 {
   1533                     status = phHciNfc_ReaderMgmt_Presence_Check(
   1534                                             psHciContext, pHwRef );
   1535                     break;
   1536                 }
   1537 #ifdef TYPE_B_PRIME
   1538                 case phHal_eISO14443_BPrime_PICC:
   1539 #endif
   1540 #ifndef TYPE_B
   1541                 case phHal_eISO14443_B_PICC:
   1542                 case phHal_eISO14443_4B_PICC:
   1543 #endif
   1544 #ifndef TYPE_FELICA
   1545                 case phHal_eFelica_PICC:
   1546 #endif
   1547 #ifndef TYPE_JEWEL
   1548                 case phHal_eJewel_PICC:
   1549 #endif
   1550                 case phHal_eUnknown_DevType:
   1551                 {
   1552                     /* Roll Back the State Machine to its Original State */
   1553                     phHciNfc_FSM_Rollback ( psHciContext );
   1554                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1555                     break;
   1556                 }
   1557                 default:
   1558                 {
   1559                     /* Roll Back the State Machine to its Original State */
   1560                     phHciNfc_FSM_Rollback ( psHciContext );
   1561                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1562                     break;
   1563                 }
   1564 
   1565             }/* End of the Remote Target Type Switch */
   1566             if( NFCSTATUS_PENDING != status )
   1567             {
   1568                 /* Roll Back the State Machine to its Original State */
   1569                 phHciNfc_FSM_Rollback ( psHciContext );
   1570             }
   1571         }
   1572         else
   1573         {
   1574             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
   1575         }
   1576     } /* End of the HCI Handle Validation */
   1577 
   1578     return status;
   1579 }
   1580 
   1581  NFCSTATUS
   1582  phHciNfc_PRBS_Test (
   1583                     void                            *psHciHandle,
   1584                     void                            *pHwRef,
   1585                     uint32_t                        test_type,
   1586                     phNfc_sData_t                   *test_param
   1587                  )
   1588  {
   1589     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1590     phHciNfc_sContext_t     *psHciContext =
   1591                             ((phHciNfc_sContext_t *)psHciHandle);
   1592 
   1593     if( (NULL == psHciContext)
   1594         || (NULL == pHwRef)
   1595         || (test_type != DEVMGMT_PRBS_TEST)
   1596         )
   1597     {
   1598         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1599     }
   1600     else
   1601     {
   1602         psHciContext->p_hw_ref = pHwRef;
   1603         status = phHciNfc_FSM_Update ( psHciContext, hciState_IO );
   1604         if (NFCSTATUS_SUCCESS == status)
   1605         {
   1606             status = phHciNfc_DevMgmt_Test(psHciContext, pHwRef,
   1607                 (uint8_t)(test_type & DEVMGMT_TEST_MASK), test_param);
   1608             if( NFCSTATUS_PENDING != status )
   1609             {
   1610                 /* Roll Back the State Machine to its Original State */
   1611                 phHciNfc_FSM_Rollback ( psHciContext );
   1612             }
   1613         }
   1614     }
   1615     return status;
   1616  }
   1617 
   1618 
   1619  NFCSTATUS
   1620  phHciNfc_System_Test (
   1621                     void                            *psHciHandle,
   1622                     void                            *pHwRef,
   1623                     uint32_t                        test_type,
   1624                     phNfc_sData_t                   *test_param
   1625                  )
   1626 {
   1627     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1628     phHciNfc_sContext_t     *psHciContext =
   1629                             ((phHciNfc_sContext_t *)psHciHandle);
   1630     static phNfc_sData_t test_result;
   1631     static uint8_t       gpio_status = 0;
   1632 
   1633     if( (NULL == psHciContext)
   1634         || (NULL == pHwRef)
   1635         )
   1636     {
   1637         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1638     }
   1639     else
   1640     {
   1641         psHciContext->p_hw_ref = pHwRef;
   1642         status = phHciNfc_FSM_Update ( psHciContext, hciState_Test );
   1643         if (NFCSTATUS_SUCCESS == status)
   1644         {
   1645             if (test_type != NFC_GPIO_READ)
   1646             {
   1647                 status = phHciNfc_DevMgmt_Test(psHciContext, pHwRef,
   1648                     (uint8_t)(test_type & DEVMGMT_TEST_MASK), test_param);
   1649             }
   1650             else
   1651             {
   1652                 test_result.buffer = &gpio_status;
   1653                 status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef,
   1654                     (uint16_t)NFC_GPIO_READ, test_result.buffer);
   1655 
   1656             }
   1657             if( NFCSTATUS_PENDING != status )
   1658             {
   1659                 /* Roll Back the State Machine to its Original State */
   1660                 phHciNfc_FSM_Rollback ( psHciContext );
   1661             }
   1662         }
   1663     }
   1664 
   1665      return status;
   1666 }
   1667 
   1668 
   1669  NFCSTATUS
   1670  phHciNfc_System_Configure (
   1671                     void                            *psHciHandle,
   1672                     void                            *pHwRef,
   1673                     uint32_t                        config_type,
   1674                     uint8_t                         config_value
   1675                  )
   1676 {
   1677     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1678     phHciNfc_sContext_t     *psHciContext =
   1679                             ((phHciNfc_sContext_t *)psHciHandle);
   1680 
   1681     if( (NULL == psHciContext)
   1682         || (NULL == pHwRef)
   1683         )
   1684     {
   1685         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1686     }
   1687     else
   1688     {
   1689         psHciContext->p_hw_ref = pHwRef;
   1690         status = phHciNfc_FSM_Update ( psHciContext, hciState_IO );
   1691         if (NFCSTATUS_SUCCESS == status)
   1692         {
   1693             status = phHciNfc_DevMgmt_Configure(psHciContext, pHwRef,
   1694                 (uint16_t)config_type, config_value);
   1695 
   1696             if( NFCSTATUS_PENDING != status )
   1697             {
   1698                 /* Roll Back the State Machine to its Original State */
   1699                 phHciNfc_FSM_Rollback ( psHciContext );
   1700             }
   1701         }
   1702     }
   1703  return status;
   1704 }
   1705 
   1706 NFCSTATUS
   1707  phHciNfc_System_Get_Info(
   1708                     void                            *psHciHandle,
   1709                     void                            *pHwRef,
   1710                     uint32_t                        config_type,
   1711                     uint8_t                         *p_config_value
   1712                  )
   1713 {
   1714     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1715     phHciNfc_sContext_t     *psHciContext =
   1716                             ((phHciNfc_sContext_t *)psHciHandle);
   1717 
   1718     if( (NULL == psHciContext)
   1719         || (NULL == pHwRef)
   1720         || (NULL == p_config_value)
   1721         )
   1722     {
   1723         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1724     }
   1725     else
   1726     {
   1727         psHciContext->p_hw_ref = pHwRef;
   1728         status = phHciNfc_FSM_Update ( psHciContext, hciState_IO );
   1729         if (NFCSTATUS_SUCCESS == status)
   1730         {
   1731             status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef,
   1732                 (uint16_t)config_type, p_config_value);
   1733 
   1734             if( NFCSTATUS_PENDING != status )
   1735             {
   1736                 /* Roll Back the State Machine to its Original State */
   1737                 phHciNfc_FSM_Rollback ( psHciContext );
   1738             }
   1739         }
   1740     }
   1741 
   1742  return status;
   1743 }
   1744 
   1745 
   1746  NFCSTATUS
   1747  phHciNfc_Get_Link_Status(
   1748                     void                            *psHciHandle,
   1749                     void                            *pHwRef
   1750                  )
   1751 {
   1752     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1753     phHciNfc_sContext_t     *psHciContext =
   1754                             ((phHciNfc_sContext_t *)psHciHandle);
   1755 
   1756     if( (NULL == psHciContext)
   1757         || (NULL == pHwRef)
   1758         )
   1759     {
   1760         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1761     }
   1762     else
   1763     {
   1764         psHciContext->p_hw_ref = pHwRef;
   1765         status = phHciNfc_FSM_Update ( psHciContext, hciState_IO );
   1766         if (NFCSTATUS_SUCCESS == status)
   1767         {
   1768             status = phHciNfc_LinkMgmt_Open(psHciContext, pHwRef);
   1769 
   1770             if( NFCSTATUS_PENDING != status )
   1771             {
   1772                 /* Roll Back the State Machine to its Original State */
   1773                 phHciNfc_FSM_Rollback ( psHciContext );
   1774             }
   1775         }
   1776     }
   1777 
   1778  return status;
   1779 }
   1780 
   1781 
   1782 
   1783