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 *                                                                             *
     22 * \file  phHciNfc_Generic.c                                                   *
     23 * \brief Generic HCI Source for the HCI Management.                           *
     24 *                                                                             *
     25 *                                                                             *
     26 * Project: NFC-FRI-1.1                                                        *
     27 *                                                                             *
     28 * $Date: Tue Jun  8 09:31:49 2010 $                                           *
     29 * $Author: ing04880 $                                                         *
     30 * $Revision: 1.108 $                                                           *
     31 * $Aliases: NFC_FRI1.1_WK1023_R35_1 $
     32 *                                                                             *
     33 * =========================================================================== *
     34 */
     35 
     36 /*
     37 ################################################################################
     38 ***************************** Header File Inclusion ****************************
     39 ################################################################################
     40 */
     41 
     42 #include <phNfcCompId.h>
     43 #include <phHciNfc_Sequence.h>
     44 #include <phHciNfc_Pipe.h>
     45 #include <phHciNfc_AdminMgmt.h>
     46 #include <phHciNfc_IDMgmt.h>
     47 #include <phHciNfc_LinkMgmt.h>
     48 #include <phHciNfc_PollingLoop.h>
     49 #include <phHciNfc_RFReader.h>
     50 #include <phHciNfc_RFReaderA.h>
     51 #include <phOsalNfc.h>
     52 
     53 /*
     54 ################################################################################
     55 ****************************** Macro Definitions *******************************
     56 ################################################################################
     57 */
     58 
     59 /* HCI timeout value */
     60 uint32_t nxp_nfc_hci_response_timeout = NXP_NFC_HCI_TIMEOUT;
     61 
     62 /*
     63 ################################################################################
     64 ************************ Static Variable Definitions ***************************
     65 ################################################################################
     66 */
     67 
     68 
     69 #if  (NXP_NFC_HCI_TIMER == 1)
     70 
     71 #define NXP_HCI_RESPONSE_TIMEOUT  (NXP_NFC_HCI_TIMEOUT)
     72 
     73 #include <phOsalNfc_Timer.h>
     74 /** \internal HCI Response Timer to detect the
     75  * Stalled HCI Response */
     76 static uint32_t                    hci_resp_timer_id = NXP_INVALID_TIMER_ID;
     77 static phHciNfc_sContext_t        *gpsHciContext= NULL;
     78 
     79 #endif /* (NXP_NFC_HCI_TIMER == 1) */
     80 
     81 
     82 /*
     83 ################################################################################
     84 ************************* Function Prototype Declaration ***********************
     85 ################################################################################
     86 */
     87 
     88 #if  (NXP_NFC_HCI_TIMER == 1)
     89 
     90 static
     91 void
     92 phHciNfc_Response_Timeout (
     93                 uint32_t resp_timer_id, void *pContext
     94                 );
     95 
     96 #endif /* (NXP_NFC_HCI_TIMER == 1) */
     97 
     98 /**
     99  * \ingroup grp_hci_nfc
    100  *
    101  *  The phHciNfc_Send function sends the HCI Commands to the
    102  *  corresponding peripheral device, described by the HCI Context Structure.
    103  *
    104  *  \param[in]  psContext               psContext is the context of
    105  *                                      the HCI Layer.
    106  *  \param[in]  pHwRef                  pHwRef is the Information of
    107  *                                      the Device Interface Link .
    108  *  \param[in]  pdata                   Pointer to the buffer containing
    109  *                                      the command to be sent.
    110  *  \param[in] length                   Variable that receives
    111  *                                      the number of bytes actually sent.
    112  *
    113  *  \retval NFCSTATUS_PENDING           Command successfully sent.
    114  *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
    115  *                                      could not be interpreted properly.
    116  *  \retval Other errors                Errors related to the lower layers
    117  *
    118  */
    119 
    120 static
    121  NFCSTATUS
    122  phHciNfc_Send(
    123                     void                    *psContext,
    124                     void                    *pHwRef,
    125                     uint8_t                 *pdata,
    126 #ifdef ONE_BYTE_LEN
    127                     uint8_t                 length
    128 #else
    129                     uint16_t                length
    130 #endif
    131               );
    132 
    133  static
    134  NFCSTATUS
    135  phHciNfc_Process_HCP (
    136                                 phHciNfc_sContext_t     *psHciContext,
    137                                 void                    *pHwRef,
    138                                 void                    *pdata,
    139 #ifdef ONE_BYTE_LEN
    140                                 uint8_t                 length
    141 #else
    142                                 uint16_t                length
    143 #endif
    144                       );
    145 
    146 
    147 static
    148 NFCSTATUS
    149 phHciNfc_Process_Response (
    150                                 phHciNfc_sContext_t     *psHciContext,
    151                                 void                    *pHwRef,
    152                                 void                    *pdata,
    153 #ifdef ONE_BYTE_LEN
    154                                 uint8_t                 length
    155 #else
    156                                 uint16_t                length
    157 #endif
    158                          );
    159 
    160 static
    161 NFCSTATUS
    162 phHciNfc_Error_Response (
    163                                 phHciNfc_sContext_t     *psHciContext,
    164                                 void                    *pHwRef,
    165                                 void                    *pdata,
    166 #ifdef ONE_BYTE_LEN
    167                                 uint8_t                 length
    168 #else
    169                                 uint16_t                length
    170 #endif
    171                          );
    172 
    173 static
    174 NFCSTATUS
    175 phHciNfc_Process_Event (
    176                                 phHciNfc_sContext_t     *psHciContext,
    177                                 void                    *pHwRef,
    178                                 void                    *pdata,
    179 #ifdef ONE_BYTE_LEN
    180                                 uint8_t                 length
    181 #else
    182                                 uint16_t                length
    183 #endif
    184                          );
    185 
    186 
    187 static
    188 NFCSTATUS
    189 phHciNfc_Process_Command (
    190                                 phHciNfc_sContext_t     *psHciContext,
    191                                 void                    *pHwRef,
    192                                 void                    *pdata,
    193 #ifdef ONE_BYTE_LEN
    194                                 uint8_t                 length
    195 #else
    196                                 uint16_t                length
    197 #endif
    198                          );
    199 
    200 
    201 static
    202 void
    203 phHciNfc_Reset_Pipe_MsgInfo(
    204                             phHciNfc_Pipe_Info_t    *p_pipe_info
    205                         );
    206 
    207 static
    208 void
    209 phHciNfc_Build_HCPMessage(
    210                                 phHciNfc_HCP_Packet_t *hcp_packet,
    211                                 uint8_t             msg_type,
    212                                 uint8_t             instruction
    213                           );
    214 
    215 static
    216 void
    217 phHciNfc_Build_HCPHeader(
    218                                 phHciNfc_HCP_Packet_t *hcp_packet,
    219                                 uint8_t             chainbit,
    220                                 uint8_t             pipe_id
    221                           );
    222 /**
    223  * \ingroup grp_hci_nfc
    224  *
    225  *  The phHciNfc_Receive_HCP function receive the HCI Host Control Packet
    226  *  Frames from the device.
    227  *
    228  *  \param[in]  psHciContext            psHciContext is the context of
    229  *                                      the HCI Layer.
    230  *  \param[in]  pHwRef                  pHwRef is the Information of
    231  *                                      the Device Interface Link .
    232  *  \param[in] pdata                    Pointer to the response buffer that
    233  *                                      receives the response read.
    234  *  \param[in] length                   Variable that receives
    235  *                                      the number of bytes read.
    236  *
    237  *  \retval NFCSTATUS_PENDING           HCP Frame receive pending.
    238  *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
    239  *                                      could not be interpreted properly.
    240  *  \retval Other errors                Other related errors
    241  *
    242  *
    243  */
    244 
    245 
    246 static
    247 NFCSTATUS
    248 phHciNfc_Receive_HCP (
    249                             phHciNfc_sContext_t     *psHciContext,
    250                             void                    *pHwRef,
    251                             uint8_t                 *pdata,
    252 #ifdef ONE_BYTE_LEN
    253                             uint8_t                 length
    254 #else
    255                             uint16_t                length
    256 #endif
    257                      );
    258 
    259 
    260 /*
    261 ################################################################################
    262 ***************************** Function Definitions *****************************
    263 ################################################################################
    264 */
    265 
    266 
    267 #if  (NXP_NFC_HCI_TIMER == 1)
    268 
    269 static
    270 void
    271 phHciNfc_Response_Timeout (
    272                     uint32_t resp_timer_id, void *pContext
    273                 )
    274 {
    275     phNfc_sCompletionInfo_t  comp_info = {0,0,0};
    276 
    277     if ( ( NULL != gpsHciContext)
    278             && (resp_timer_id == hci_resp_timer_id ))
    279     {
    280         pphNfcIF_Notification_CB_t  p_upper_notify =
    281             gpsHciContext->p_upper_notify;
    282         void                        *p_upper_context =
    283                                 gpsHciContext->p_upper_context;
    284         phHal_sHwReference_t        *pHwRef = gpsHciContext->p_hw_ref;
    285 		uint32_t				i = 0;
    286 
    287 
    288         HCI_DEBUG(" HCI TIMEOUT: HCI Response Timeout Occurred in %X Timer\n"
    289                                                                  ,resp_timer_id);
    290         /* Stop the Response Timer */
    291         phOsalNfc_Timer_Stop( hci_resp_timer_id );
    292 
    293 		comp_info.status = PHNFCSTVAL(CID_NFC_HCI,
    294                         NFCSTATUS_BOARD_COMMUNICATION_ERROR);
    295         /* Roll Back to the Select State */
    296         phHciNfc_FSM_Rollback(gpsHciContext);
    297 
    298 		for(i=0;i < PHHCINFC_MAX_PIPE; i++)
    299 		{
    300 			phHciNfc_Reset_Pipe_MsgInfo(gpsHciContext->p_pipe_list[i]);
    301 		}
    302 
    303         /* Notify the Error/Success Scenario to the upper layer */
    304         phHciNfc_Notify( p_upper_notify, p_upper_context,
    305                     pHwRef, (uint8_t) NFC_NOTIFY_DEVICE_ERROR, &comp_info );
    306     }
    307 
    308     return ;
    309 
    310 }
    311 
    312 #endif /* (NXP_NFC_HCI_TIMER == 1) */
    313 
    314 
    315 
    316 /*!
    317  * \brief Allocation of the HCI Interface resources.
    318  *
    319  * This function releases and frees all the resources used by HCI Command and
    320  * Response Mechanism
    321  */
    322 
    323  NFCSTATUS
    324  phHciNfc_Allocate_Resource (
    325                                 void                **ppBuffer,
    326                                 uint16_t            size
    327                             )
    328 {
    329     NFCSTATUS           status = NFCSTATUS_SUCCESS;
    330 
    331     *ppBuffer = (void *) phOsalNfc_GetMemory(size);
    332     if( *ppBuffer != NULL )
    333     {
    334         (void )memset(((void *)*ppBuffer), 0,
    335                                     size);
    336     }
    337     else
    338     {
    339         *ppBuffer = NULL;
    340         status = PHNFCSTVAL(CID_NFC_HCI,
    341                         NFCSTATUS_INSUFFICIENT_RESOURCES);
    342     }
    343     return status;
    344 }
    345 
    346 
    347 
    348 /*!
    349  * \brief Release of the HCI Interface resources.
    350  *
    351  * This function releases and frees all the resources used by HCI Command and
    352  * Response Mechanism
    353  */
    354  void
    355  phHciNfc_Release_Resources (
    356                                 phHciNfc_sContext_t **ppsHciContext
    357                             )
    358 {
    359     uint8_t i = 0;
    360 
    361 
    362 #if  (NXP_NFC_HCI_TIMER == 1)
    363 
    364     if ( NXP_INVALID_TIMER_ID != hci_resp_timer_id )
    365     {
    366         /* Stop and Un-Intialise the Response Timer */
    367         phOsalNfc_Timer_Stop( hci_resp_timer_id );
    368         phOsalNfc_Timer_Delete( hci_resp_timer_id );
    369         HCI_DEBUG(" HCI : Timer %X Stopped and Released\n",
    370                                             hci_resp_timer_id);
    371         hci_resp_timer_id = NXP_INVALID_TIMER_ID;
    372     }
    373     gpsHciContext = NULL;
    374 
    375 #endif /* (NXP_NFC_HCI_TIMER == 1) */
    376 
    377 
    378     if(NULL != (*ppsHciContext)->p_admin_info)
    379     {
    380         phOsalNfc_FreeMemory((*ppsHciContext)->p_admin_info);
    381         (*ppsHciContext)->p_admin_info = NULL;
    382     }
    383     if(NULL !=(*ppsHciContext)->p_link_mgmt_info)
    384     {
    385         phOsalNfc_FreeMemory((*ppsHciContext)->p_link_mgmt_info);
    386         (*ppsHciContext)->p_link_mgmt_info = NULL;
    387     }
    388     if(NULL !=(*ppsHciContext)->p_identity_info)
    389     {
    390         phOsalNfc_FreeMemory((*ppsHciContext)->p_identity_info);
    391         (*ppsHciContext)->p_identity_info = NULL;
    392     }
    393     if(NULL !=(*ppsHciContext)->p_device_mgmt_info)
    394     {
    395         phOsalNfc_FreeMemory((*ppsHciContext)->p_device_mgmt_info);
    396         (*ppsHciContext)->p_device_mgmt_info = NULL;
    397     }
    398     if(NULL !=(*ppsHciContext)->p_reader_mgmt_info)
    399     {
    400         phOsalNfc_FreeMemory((*ppsHciContext)->p_reader_mgmt_info);
    401         (*ppsHciContext)->p_reader_mgmt_info = NULL;
    402     }
    403     if(NULL !=(*ppsHciContext)->p_poll_loop_info)
    404     {
    405         phOsalNfc_FreeMemory((*ppsHciContext)->p_poll_loop_info);
    406         (*ppsHciContext)->p_poll_loop_info = NULL;
    407     }
    408     if(NULL !=(*ppsHciContext)->p_reader_a_info)
    409     {
    410         phOsalNfc_FreeMemory((*ppsHciContext)->p_reader_a_info);
    411         (*ppsHciContext)->p_reader_a_info = NULL;
    412     }
    413 #ifdef TYPE_B
    414     if(NULL !=(*ppsHciContext)->p_reader_b_info)
    415     {
    416         phOsalNfc_FreeMemory((*ppsHciContext)->p_reader_b_info);
    417         (*ppsHciContext)->p_reader_b_info = NULL;
    418     }
    419 #endif
    420 #ifdef TYPE_FELICA
    421     if(NULL !=(*ppsHciContext)->p_felica_info)
    422     {
    423         phOsalNfc_FreeMemory((*ppsHciContext)->p_felica_info);
    424         (*ppsHciContext)->p_felica_info = NULL;
    425     }
    426 #endif
    427 #ifdef TYPE_JEWEL
    428     if(NULL !=(*ppsHciContext)->p_jewel_info)
    429     {
    430         phOsalNfc_FreeMemory((*ppsHciContext)->p_jewel_info);
    431         (*ppsHciContext)->p_jewel_info = NULL;
    432     }
    433 #endif
    434 #ifdef  TYPE_ISO15693
    435     if(NULL !=(*ppsHciContext)->p_iso_15693_info)
    436     {
    437         phOsalNfc_FreeMemory((*ppsHciContext)->p_iso_15693_info);
    438         (*ppsHciContext)->p_iso_15693_info = NULL;
    439     }
    440 #endif /* #ifdef    TYPE_ISO15693 */
    441 #ifdef ENABLE_P2P
    442     if(NULL !=(*ppsHciContext)->p_nfcip_info)
    443     {
    444         phOsalNfc_FreeMemory((*ppsHciContext)->p_nfcip_info);
    445         (*ppsHciContext)->p_nfcip_info = NULL;
    446     }
    447 #endif
    448     if(NULL !=(*ppsHciContext)->p_emulation_mgmt_info)
    449     {
    450         phOsalNfc_FreeMemory((*ppsHciContext)->p_emulation_mgmt_info);
    451         (*ppsHciContext)->p_emulation_mgmt_info = NULL;
    452     }
    453     if(NULL !=(*ppsHciContext)->p_wi_info)
    454     {
    455         phOsalNfc_FreeMemory((*ppsHciContext)->p_wi_info);
    456         (*ppsHciContext)->p_wi_info = NULL;
    457     }
    458     if(NULL !=(*ppsHciContext)->p_swp_info)
    459     {
    460         phOsalNfc_FreeMemory((*ppsHciContext)->p_swp_info);
    461         (*ppsHciContext)->p_swp_info = NULL;
    462     }
    463     if(NULL !=(*ppsHciContext)->p_uicc_info)
    464     {
    465         phOsalNfc_FreeMemory((*ppsHciContext)->p_uicc_info);
    466         (*ppsHciContext)->p_uicc_info = NULL;
    467     }
    468 #ifdef HOST_EMULATION
    469     if(NULL !=(*ppsHciContext)->p_ce_a_info)
    470     {
    471         phOsalNfc_FreeMemory((*ppsHciContext)->p_ce_a_info);
    472         (*ppsHciContext)->p_ce_a_info = NULL;
    473     }
    474     if(NULL !=(*ppsHciContext)->p_ce_b_info)
    475     {
    476         phOsalNfc_FreeMemory((*ppsHciContext)->p_ce_b_info);
    477         (*ppsHciContext)->p_ce_b_info = NULL;
    478     }
    479 #endif
    480 
    481     for(i=0;i < PHHCINFC_MAX_PIPE; i++)
    482     {
    483         if(NULL != (*ppsHciContext)->p_pipe_list[i])
    484         {
    485             phOsalNfc_FreeMemory((*ppsHciContext)->p_pipe_list[i]);
    486         }
    487     }
    488 
    489 
    490     phOsalNfc_FreeMemory((*ppsHciContext));
    491     (*ppsHciContext) = NULL;
    492 
    493     return ;
    494 }
    495 
    496 static
    497 void
    498 phHciNfc_Reset_Pipe_MsgInfo(
    499                             phHciNfc_Pipe_Info_t    *p_pipe_info
    500                         )
    501 {
    502     if (p_pipe_info != NULL)
    503     {
    504         p_pipe_info->sent_msg_type = HCP_MSG_TYPE_RESERVED;
    505         p_pipe_info->prev_msg = MSG_INSTRUCTION_UNKNWON;
    506         p_pipe_info->prev_status = NFCSTATUS_INVALID_HCI_INSTRUCTION;
    507         p_pipe_info->param_info = NULL;
    508         p_pipe_info->param_length = FALSE ;
    509     }
    510     return;
    511 }
    512 
    513 
    514 void
    515 phHciNfc_Release_Lower(
    516                     phHciNfc_sContext_t         *psHciContext,
    517                     void                        *pHwRef
    518                )
    519 {
    520     phNfc_sLowerIF_t            *plower_if =
    521                                     &(psHciContext->lower_interface);
    522     NFCSTATUS            status = NFCSTATUS_SUCCESS;
    523 
    524     PHNFC_UNUSED_VARIABLE(status);
    525     if(NULL != plower_if->release)
    526     {
    527         status = plower_if->release((void *)plower_if->pcontext,
    528                                         (void *)pHwRef);
    529         (void) memset((void *)plower_if, 0, sizeof(phNfc_sLowerIF_t));
    530         HCI_DEBUG(" HCI Releasing the Lower Layer Resources: Status = %02X\n"
    531                                                                     ,status);
    532     }
    533 
    534     return;
    535 }
    536 
    537 
    538 
    539 /*!
    540  * \brief Sends the HCI Commands to the corresponding peripheral device.
    541  *
    542  * This function sends the HCI Commands to the connected NFC Pheripheral device
    543  */
    544  static
    545  NFCSTATUS
    546  phHciNfc_Send (
    547                       void                  *psContext,
    548                       void                  *pHwRef,
    549                       uint8_t               *pdata,
    550 #ifdef ONE_BYTE_LEN
    551                       uint8_t               length
    552 #else
    553                       uint16_t              length
    554 #endif
    555                      )
    556 {
    557     phHciNfc_sContext_t     *psHciContext= (phHciNfc_sContext_t  *)psContext;
    558     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    559 
    560     phNfc_sLowerIF_t        *plower_if = &(psHciContext->lower_interface);
    561 
    562     if( (NULL != plower_if)
    563         && (NULL != plower_if->send)
    564       )
    565     {
    566         HCI_DEBUG("HCI: In Function: %s \n", __FUNCTION__);
    567         HCI_DEBUG("HCI: Response Pending status --> %s \n",
    568             (psHciContext->response_pending)?"TRUE":"FALSE");
    569         HCI_PRINT_BUFFER("Send Buffer",pdata,length);
    570         /* psHciContext->hci_transact_state = NFC_TRANSACT_SEND_IN_PROGRESS; */
    571 
    572 #if  (NXP_NFC_HCI_TIMER == 1)
    573 
    574     if (
    575         (TRUE != psHciContext->tx_hcp_chaining)
    576         &&  (TRUE == psHciContext->response_pending)
    577         && ( NXP_INVALID_TIMER_ID != hci_resp_timer_id )
    578        )
    579     {
    580         /* Start the HCI Response Timer */
    581         phOsalNfc_Timer_Start( hci_resp_timer_id,
    582                 nxp_nfc_hci_response_timeout, phHciNfc_Response_Timeout, NULL );
    583         HCI_DEBUG(" HCI : Timer %X Started \n", hci_resp_timer_id);
    584     }
    585 
    586 #endif /* (NXP_NFC_HCI_TIMER == 1) */
    587 
    588         status = plower_if->send((void *)plower_if->pcontext,
    589                                 (void *)pHwRef, pdata, length);
    590     }
    591 
    592     return status;
    593 }
    594 
    595 
    596 /*!
    597  * \brief Receives the HCI Response from the corresponding peripheral device.
    598  *
    599  * This function receives the HCI Command Response to the connected NFC
    600  * Pheripheral device.
    601  */
    602 
    603 NFCSTATUS
    604 phHciNfc_Receive(
    605                         void                *psContext,
    606                         void                *pHwRef,
    607                         uint8_t             *pdata,
    608 #ifdef ONE_BYTE_LEN
    609                         uint8_t             length
    610 #else
    611                         uint16_t            length
    612 #endif
    613                     )
    614 {
    615     phHciNfc_sContext_t     *psHciContext= (phHciNfc_sContext_t  *)psContext;
    616     phNfc_sLowerIF_t *plower_if = NULL ;
    617     NFCSTATUS         status = NFCSTATUS_SUCCESS;
    618 
    619     if(NULL == psHciContext )
    620     {
    621         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    622     }
    623     else
    624     {
    625         plower_if = &(psHciContext->lower_interface);
    626 
    627         if( (NULL != plower_if)
    628             && (NULL != plower_if->receive)
    629           )
    630         {
    631             /* psHciContext->hci_transact_state = NFC_TRANSACT_RECV_IN_PROGRESS; */
    632             status = plower_if->receive((void *)plower_if->pcontext,
    633                                     (void *)pHwRef, pdata, length);
    634         }
    635     }
    636     return status;
    637 }
    638 
    639 
    640 /*!
    641  * \brief Sends the HCP Packet to the lower link layer .
    642  *
    643  * This function Sends the HCI Data in the HCP packet format to the below
    644  * Link layer.
    645  */
    646 
    647  NFCSTATUS
    648  phHciNfc_Send_HCP (
    649                                 phHciNfc_sContext_t *psHciContext,
    650                                 void                *pHwRef
    651                    )
    652 {
    653     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    654     phHciNfc_HCP_Packet_t   *tx_data = (phHciNfc_HCP_Packet_t *)
    655                                     psHciContext->send_buffer;
    656     /* Skip the HCP Header Byte initially */
    657     uint16_t                tx_length = psHciContext->tx_total - 1 ;
    658     uint16_t                hcp_index = HCP_ZERO_LEN;
    659     uint8_t                 pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
    660     static  uint8_t         chain_bit = HCP_CHAINBIT_DEFAULT;
    661 
    662     pipe_id =  (uint8_t) GET_BITS8( tx_data->hcp_header,
    663         HCP_PIPEID_OFFSET, HCP_PIPEID_LEN);
    664 
    665     /* Fragmentation of the HCP Frames */
    666     if ( tx_length > PHHCINFC_MAX_PACKET_DATA )
    667     {
    668         tx_data = &psHciContext->tx_packet;
    669         (void)memset((void *)tx_data, FALSE,
    670                         sizeof(phHciNfc_HCP_Packet_t));
    671         if (HCP_CHAINBIT_DEFAULT == chain_bit)
    672         {
    673             /* HCI Chaining Needs to be Done */
    674             psHciContext->tx_remain = tx_length;
    675             psHciContext->tx_hcp_frgmnt_index = HCP_ZERO_LEN ;
    676             chain_bit = HCP_CHAINBIT_BEGIN;
    677             /* Increment the Fragment index to skip the HCP Header */
    678             psHciContext->tx_hcp_frgmnt_index++;
    679             psHciContext->tx_hcp_chaining = TRUE ;
    680             tx_length = PHHCINFC_MAX_PACKET_DATA ;
    681         }
    682         else if ( psHciContext->tx_remain > PHHCINFC_MAX_PACKET_DATA )
    683         {
    684 			/* Intermediate Chained HCI Frames */
    685             tx_length = PHHCINFC_MAX_PACKET_DATA ;
    686         }
    687         else
    688         {
    689             /* End of Chaining Reached */
    690             chain_bit = HCP_CHAINBIT_END;
    691             tx_length = psHciContext->tx_remain ;
    692             psHciContext->tx_hcp_chaining = FALSE ;
    693         }
    694 
    695         /* Build the HCP Header to have Chaining Enabled */
    696         phHciNfc_Build_HCPHeader(tx_data, chain_bit , pipe_id );
    697 
    698         phHciNfc_Append_HCPFrame((uint8_t *)tx_data->msg.payload, hcp_index,
    699             (&psHciContext->send_buffer[psHciContext->tx_hcp_frgmnt_index])
    700             , tx_length );
    701     }
    702     else
    703     {
    704         /* No Chaining Required */
    705         chain_bit = HCP_CHAINBIT_DEFAULT;
    706 
    707         psHciContext->tx_hcp_chaining = FALSE ;
    708 
    709         psHciContext->tx_remain = tx_length ;
    710     }
    711 
    712     /* Include the Skipped HCP Header Byte */
    713     tx_length++;
    714 
    715     status = phHciNfc_Send ( (void *) psHciContext, pHwRef,
    716                         (uint8_t *)tx_data, tx_length );
    717 
    718     return status;
    719 }
    720 
    721 
    722 /*!
    723  * \brief Receives the HCP Packet from the lower link layer .
    724  *
    725  * This function receives the HCI Data in the HCP packet format from the below
    726  * Link layer.
    727  */
    728  static
    729  NFCSTATUS
    730  phHciNfc_Receive_HCP (
    731                                 phHciNfc_sContext_t *psHciContext,
    732                                 void                *pHwRef,
    733                                 uint8_t             *pdata,
    734 #ifdef ONE_BYTE_LEN
    735                                 uint8_t             length
    736 #else
    737                                 uint16_t            length
    738 #endif
    739                    )
    740 {
    741     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    742     phHciNfc_HCP_Packet_t   *packet = NULL;
    743     uint8_t                 chainbit = HCP_CHAINBIT_DEFAULT;
    744     uint16_t                hcp_index = 0;
    745 
    746     packet = (phHciNfc_HCP_Packet_t *)pdata;
    747     chainbit = (uint8_t) GET_BITS8( packet->hcp_header,
    748         HCP_CHAINBIT_OFFSET, HCP_CHAINBIT_LEN);
    749     hcp_index = psHciContext->rx_hcp_frgmnt_index;
    750     HCI_PRINT_BUFFER("Receive Buffer",((uint8_t *)pdata),length);
    751     if (HCP_CHAINBIT_BEGIN == chainbit)
    752     {
    753         /* pdata = (uint8_t *)&psHciContext->rx_packet; */
    754         /* De Fragmentation of the Received HCP Frames */
    755         /* Subsequent Chaining Frames */
    756         if( hcp_index  > 0 )
    757         {
    758             /* Copy the obtained fragment and receive the next fragment */
    759             phHciNfc_Append_HCPFrame(
    760                 psHciContext->recv_buffer, hcp_index,
    761                     (uint8_t *)&pdata[HCP_MESSAGE_LEN],
    762                             (length - HCP_MESSAGE_LEN) );
    763             psHciContext->rx_hcp_frgmnt_index =(uint16_t)
    764                         (hcp_index + length - HCP_MESSAGE_LEN);
    765         }
    766         /* First Chaining Frame*/
    767         else
    768         {
    769             psHciContext->rx_hcp_chaining = TRUE ;
    770             /* Copy the obtained fragment and receive the next fragment */
    771             phHciNfc_Append_HCPFrame(psHciContext->recv_buffer,
    772                 hcp_index, pdata, length);
    773             psHciContext->rx_hcp_frgmnt_index = ( hcp_index + length ) ;
    774 
    775         }
    776         status = phHciNfc_Receive ( (void *) psHciContext, pHwRef,
    777                                                 pdata, length);
    778     }
    779     else
    780     {
    781         if(TRUE == psHciContext->rx_hcp_chaining)
    782         {
    783             /* If the chaining was done earlier */
    784             psHciContext->rx_hcp_chaining = FALSE ;
    785             /* Copy the Remaining buffer to the RX_BUFFER */
    786             phHciNfc_Append_HCPFrame(
    787                 psHciContext->recv_buffer, hcp_index,
    788                     (uint8_t *)&pdata[HCP_MESSAGE_LEN],
    789                             (length - HCP_MESSAGE_LEN) );
    790             /* If there is chaining done the return the same data */
    791             psHciContext->rx_total =
    792                         (hcp_index + length - HCP_MESSAGE_LEN);
    793             psHciContext->rx_hcp_frgmnt_index = FALSE ;
    794         }
    795         else
    796         {
    797             (void) memcpy( psHciContext->recv_buffer, pdata, length);
    798             /* If there is no chaining done then return the same data */
    799             psHciContext->rx_total = (hcp_index + length);
    800 
    801         }
    802     }
    803 
    804     return status;
    805 }
    806 
    807 
    808 /*!
    809  * \brief Receives the HCP Packet from the lower link layer .
    810  *
    811  * This function receives the HCI Data in the HCP packet format from the below
    812  * Link layer.
    813  */
    814 
    815  static
    816  NFCSTATUS
    817  phHciNfc_Process_HCP (
    818                                 phHciNfc_sContext_t     *psHciContext,
    819                                 void                    *pHwRef,
    820                                 void                    *pdata,
    821 #ifdef ONE_BYTE_LEN
    822                                 uint8_t             length
    823 #else
    824                                 uint16_t            length
    825 #endif
    826                       )
    827 {
    828     phHciNfc_HCP_Packet_t   *packet = NULL;
    829     phHciNfc_HCP_Message_t  *message = NULL;
    830     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    831     uint8_t                 msg_type = 0;
    832 
    833     if( (NULL == pdata)
    834         || ( length < HCP_HEADER_LEN )
    835       )
    836     {
    837         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    838     }
    839     else
    840     {
    841         status = phHciNfc_Receive_HCP( psHciContext, pHwRef, pdata, length );
    842     }/* End of the Valid Data Handling */
    843 
    844     if( NFCSTATUS_SUCCESS  == status )
    845     {
    846         packet = (phHciNfc_HCP_Packet_t *)psHciContext->recv_buffer;
    847         length =
    848 #ifdef ONE_BYTE_LEN
    849             (uint8_t)
    850 #endif
    851             psHciContext->rx_total ;
    852         message = &packet->msg.message;
    853         /* HCI_PRINT_BUFFER("Total Receive Buffer",((uint8_t *)pdata),length); */
    854         msg_type = (uint8_t) GET_BITS8( message->msg_header,
    855             HCP_MSG_TYPE_OFFSET, HCP_MSG_TYPE_LEN);
    856         switch ( msg_type )
    857         {
    858             case HCP_MSG_TYPE_RESPONSE:
    859             {
    860                 status = phHciNfc_Process_Response( psHciContext,
    861                                                 pHwRef, (void *)packet, length );
    862                 break;
    863             }
    864             case HCP_MSG_TYPE_EVENT:
    865             {
    866                 status = phHciNfc_Process_Event( psHciContext,
    867                                                 pHwRef,(void *)packet, length );
    868                 break;
    869             }
    870             case HCP_MSG_TYPE_COMMAND:
    871             {
    872 
    873                 status = phHciNfc_Process_Command( psHciContext,
    874                                                 pHwRef, (void *)packet, length );
    875                 break;
    876             }
    877             /* case HCP_MSG_TYPE_RESERVED: */
    878             default:
    879             {
    880                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
    881                 break;
    882             }
    883         }
    884     }/* End of Receive HCP Status */
    885     return status;
    886 }
    887 
    888 
    889  static
    890  NFCSTATUS
    891  phHciNfc_Process_Response (
    892                                  phHciNfc_sContext_t    *psHciContext,
    893                                  void                   *pHwRef,
    894                                  void                   *pdata,
    895 #ifdef ONE_BYTE_LEN
    896                                  uint8_t             length
    897 #else
    898                                  uint16_t            length
    899 #endif
    900                              )
    901 {
    902     phHciNfc_HCP_Packet_t   *packet = NULL;
    903     phHciNfc_HCP_Message_t  *message = NULL;
    904     uint8_t                 instruction=0;
    905     uint8_t                 pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
    906     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;
    907 
    908     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    909 
    910     packet = (phHciNfc_HCP_Packet_t *)pdata;
    911     message = &packet->msg.message;
    912     /* Get the instruction bits from the Message Header */
    913     instruction = (uint8_t) GET_BITS8( message->msg_header,
    914                                 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
    915     /* Get the Pipe ID from the HCP Header */
    916     pipe_id =  (uint8_t) GET_BITS8( packet->hcp_header,
    917                                 HCP_PIPEID_OFFSET, HCP_PIPEID_LEN);
    918 
    919 #if  (NXP_NFC_HCI_TIMER == 1)
    920 
    921     if ( NXP_INVALID_TIMER_ID != hci_resp_timer_id )
    922     {
    923         /* Stop the HCI Response Timer */
    924         HCI_DEBUG(" HCI : Timer %X Stopped \n", hci_resp_timer_id);
    925         phOsalNfc_Timer_Stop( hci_resp_timer_id );
    926     }
    927 
    928 #endif /* (NXP_NFC_HCI_TIMER == 1) */
    929 
    930     if (pipe_id >=  PHHCINFC_MAX_PIPE )
    931     {
    932         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
    933     }
    934     else if( ((uint8_t) ANY_OK != instruction)
    935         && ( (pipe_id !=    PIPETYPE_STATIC_ADMIN )
    936         && ( ADM_CLEAR_ALL_PIPE != (psHciContext->p_pipe_list[pipe_id])->prev_msg ))
    937         )
    938     {
    939         status = phHciNfc_Error_Response( psHciContext, pHwRef, pdata, length );
    940     }
    941     else
    942     {
    943         p_pipe_info = psHciContext->p_pipe_list[pipe_id];
    944         if( ( NULL != p_pipe_info )
    945             &&   ( HCP_MSG_TYPE_COMMAND == p_pipe_info->sent_msg_type  )
    946             &&   ( NULL != p_pipe_info->recv_resp )
    947         )
    948         {
    949             status = psHciContext->p_pipe_list[pipe_id]->recv_resp( psHciContext,
    950                                                             pHwRef, pdata, length );
    951         }
    952         else
    953         {
    954             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    955         }
    956         /* There is no Pending Response */
    957         psHciContext->response_pending = FALSE ;
    958         HCI_DEBUG("HCI: Response Pending status --> FALSE, %s \n",
    959             __FUNCTION__);
    960         if( NFCSTATUS_SUCCESS == status )
    961         {
    962             phHciNfc_Reset_Pipe_MsgInfo(psHciContext->p_pipe_list[pipe_id]);
    963             status = phHciNfc_Resume_Sequence(psHciContext, pHwRef);
    964 
    965         }/* End of Success Status validation */
    966         else
    967         {
    968             HCI_DEBUG("HCI: Status --> %X \n", status );
    969         }
    970 
    971     } /* End of the Valid Response handling */
    972     return status;
    973 }
    974 
    975 
    976 static
    977  NFCSTATUS
    978  phHciNfc_Error_Response (
    979                                 phHciNfc_sContext_t     *psHciContext,
    980                                 void                    *pHwRef,
    981                                 void                    *pdata,
    982 #ifdef ONE_BYTE_LEN
    983                                 uint8_t                 length
    984 #else
    985                                 uint16_t                length
    986 #endif
    987                          )
    988 {
    989 
    990     phHciNfc_HCP_Packet_t   *packet = (phHciNfc_HCP_Packet_t *)pdata;
    991     phHciNfc_HCP_Message_t  *message = &packet->msg.message;
    992     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    993     uint8_t                 pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
    994 #if defined(HCI_TRACE) || defined (ERROR_INSTRUCTION)
    995     uint8_t                 instruction = 0;
    996     instruction = (uint8_t) GET_BITS8(message->msg_header,
    997                             HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
    998 #endif
    999 
   1000     /* Get the Pipe ID from the HCP Header */
   1001     pipe_id =  (uint8_t) GET_BITS8( packet->hcp_header,
   1002                                 HCP_PIPEID_OFFSET, HCP_PIPEID_LEN);
   1003     /* Process the Error Response based on the obtained instruction */
   1004 #ifdef ERROR_INSTRUCTION
   1005     switch(instruction)
   1006     {
   1007         case ANY_E_NOT_CONNECTED:
   1008         case ANY_E_CMD_PAR_UNKNOWN:
   1009         case ANY_E_NOK:
   1010         case ANY_E_PIPES_FULL:
   1011         case ANY_E_REG_PAR_UNKNOWN:
   1012         case ANY_E_PIPE_NOT_OPENED:
   1013         case ANY_E_CMD_NOT_SUPPORTED:
   1014         case ANY_E_TIMEOUT:
   1015         case ANY_E_REG_ACCESS_DENIED:
   1016         case ANY_E_PIPE_ACCESS_DENIED:
   1017         {
   1018             /* Receive Error Notification to the Upper Layer */
   1019             status = PHNFCSTVAL( CID_NFC_HCI, \
   1020                             message->msg_header);
   1021             phHciNfc_Error_Sequence(psHciContext, pHwRef, status , pdata, length );
   1022             /* Return Success as the Error Sequence is already handled */
   1023             psHciContext->response_pending = FALSE ;
   1024             HCI_DEBUG("HCI: Response Pending status --> FALSE, %s \n",
   1025             __FUNCTION__);
   1026             status = NFCSTATUS_SUCCESS;
   1027             break;
   1028         }
   1029             /* The Statement should not reach this case */
   1030         /* case ANY_OK: */
   1031         default:
   1032         {
   1033             /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); */
   1034             break;
   1035         }
   1036     }
   1037 #else
   1038     status = PHNFCSTVAL( CID_NFC_HCI, message->msg_header);
   1039     HCI_DEBUG("HCI Error Response(%u) from the Device \n", instruction);
   1040     psHciContext->response_pending = FALSE ;
   1041     HCI_DEBUG("HCI: Response Pending status --> FALSE, %s \n",
   1042         __FUNCTION__);
   1043     phHciNfc_Reset_Pipe_MsgInfo(psHciContext->p_pipe_list[pipe_id]);
   1044     phHciNfc_Error_Sequence(psHciContext, pHwRef, status , pdata, (uint8_t) length );
   1045     /* Return Success as the Error Sequence is already handled */
   1046     status = NFCSTATUS_SUCCESS;
   1047 #endif
   1048 
   1049     return status;
   1050 }
   1051 
   1052 
   1053 static
   1054  NFCSTATUS
   1055  phHciNfc_Process_Event (
   1056                                 phHciNfc_sContext_t     *psHciContext,
   1057                                 void                    *pHwRef,
   1058                                 void                    *pdata,
   1059 #ifdef ONE_BYTE_LEN
   1060                                 uint8_t                 length
   1061 #else
   1062                                 uint16_t                length
   1063 #endif
   1064                         )
   1065 {
   1066     phHciNfc_HCP_Packet_t   *packet = NULL;
   1067     phHciNfc_HCP_Message_t  *message = NULL;
   1068     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;
   1069     uint8_t                 instruction=0;
   1070     uint8_t                 pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
   1071 
   1072     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1073 
   1074     packet = (phHciNfc_HCP_Packet_t *)pdata;
   1075     message = &packet->msg.message;
   1076     /* Get the instruction bits from the Message Header */
   1077     PHNFC_UNUSED_VARIABLE(instruction);
   1078     instruction = (uint8_t) GET_BITS8( message->msg_header,
   1079                                 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
   1080     /* Get the Pipe ID from the HCP Header */
   1081     pipe_id =  (uint8_t) GET_BITS8( packet->hcp_header,
   1082                                 HCP_PIPEID_OFFSET, HCP_PIPEID_LEN);
   1083 
   1084     if (pipe_id >=  PHHCINFC_MAX_PIPE )
   1085     {
   1086         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
   1087     }
   1088     else
   1089     {
   1090         p_pipe_info = psHciContext->p_pipe_list[pipe_id];
   1091     }
   1092 
   1093     if( (p_pipe_info != NULL ) )
   1094     {
   1095         if( NULL != p_pipe_info->recv_event)
   1096         {
   1097             status = p_pipe_info->recv_event( psHciContext, pHwRef,
   1098                                                         pdata, length );
   1099         }
   1100         else
   1101         {
   1102             HCI_DEBUG(" Event Handling Not Supported by the #%u Pipe \n",
   1103                                                         pipe_id);
   1104             status = PHNFCSTVAL(CID_NFC_HCI,
   1105                                         NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1106         }
   1107     }
   1108     else
   1109     {
   1110         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1111     }
   1112 
   1113     HCI_DEBUG("HCI: In Function: %s \n",
   1114         __FUNCTION__);
   1115     HCI_DEBUG("HCI: Response Pending status --> %s \n",
   1116         (psHciContext->response_pending)?"TRUE":"FALSE");
   1117     HCI_DEBUG("HCI: Event Pending status --> %s \n",
   1118         (psHciContext->event_pending)?"TRUE":"FALSE");
   1119 
   1120         if ((TRUE == psHciContext->response_pending)
   1121         || (TRUE == psHciContext->event_pending))
   1122     {
   1123         (void)memset(psHciContext->recv_buffer,
   1124             FALSE, PHHCINFC_MAX_BUFFERSIZE);
   1125         (void)memset((void *)&psHciContext->rx_packet,
   1126             FALSE, sizeof(phHciNfc_HCP_Packet_t));
   1127 
   1128         /* Reset the Received Data Index */
   1129         psHciContext->rx_index = ZERO;
   1130         /* Reset the size of the total response data received */
   1131         psHciContext->rx_total = ZERO;
   1132 
   1133         /* psHciContext->hci_transact_state = NFC_TRANSACT_SEND_COMPLETE;*/
   1134         /* Receive the Response Packet */
   1135 
   1136         status = phHciNfc_Receive( psHciContext, pHwRef,
   1137                     (uint8_t *)(&psHciContext->rx_packet),
   1138                     sizeof(phHciNfc_HCP_Packet_t) );
   1139 
   1140         /* HCI_DEBUG("HCI Lower Layer Send Completion After Receive,\
   1141         Status = %02X\n",status); */
   1142     }
   1143     else
   1144     {
   1145         if(
   1146 /* #define EVENT_NOTIFY */
   1147 #ifndef EVENT_NOTIFY
   1148             ( NFCSTATUS_SUCCESS == status  )
   1149             || ( NFCSTATUS_RF_TIMEOUT == status  )
   1150             || (( NFCSTATUS_MORE_INFORMATION == status  )
   1151 #else
   1152             ((FALSE == psHciContext->event_pending )
   1153 #endif
   1154             && ( pipe_id <= PHHCINFC_MAX_PIPE ))
   1155             )
   1156         {
   1157             /* phHciNfc_Reset_Pipe_MsgInfo(psHciContext->p_pipe_list[pipe_id]); */
   1158             status = phHciNfc_Resume_Sequence(psHciContext, pHwRef);
   1159 
   1160         }/* End of Success Status validation */
   1161         else
   1162         {
   1163             HCI_DEBUG(" HCI: Pipe-ID --> %02X  \n", pipe_id);
   1164             HCI_DEBUG(" HCI: PROCESS EVENT - Pending/Invalid Status : %X\n", status);
   1165         }
   1166     }
   1167 
   1168     return status;
   1169 }
   1170 
   1171 static
   1172  NFCSTATUS
   1173  phHciNfc_Process_Command (
   1174                                 phHciNfc_sContext_t     *psHciContext,
   1175                                 void                    *pHwRef,
   1176                                 void                    *pdata,
   1177 #ifdef ONE_BYTE_LEN
   1178                                 uint8_t                 length
   1179 #else
   1180                                 uint16_t                length
   1181 #endif
   1182                              )
   1183 {
   1184     phHciNfc_HCP_Packet_t   *packet = NULL;
   1185     phHciNfc_HCP_Message_t  *message = NULL;
   1186     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;
   1187     uint8_t                 instruction=0;
   1188     uint8_t                 pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
   1189 
   1190     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1191 
   1192     packet = (phHciNfc_HCP_Packet_t *)pdata;
   1193     message = &packet->msg.message;
   1194     /* Get the instruction bits from the Message Header */
   1195     PHNFC_UNUSED_VARIABLE(instruction);
   1196 
   1197     instruction = (uint8_t) GET_BITS8( message->msg_header,
   1198                                 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
   1199     /* Get the Pipe ID from the HCP Header */
   1200     pipe_id =  (uint8_t) GET_BITS8( packet->hcp_header,
   1201                                 HCP_PIPEID_OFFSET, HCP_PIPEID_LEN);
   1202     if (pipe_id >=  PHHCINFC_MAX_PIPE )
   1203     {
   1204         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
   1205     }
   1206     else
   1207     {
   1208         p_pipe_info = psHciContext->p_pipe_list[pipe_id];
   1209     }
   1210 
   1211     if( (p_pipe_info != NULL )
   1212         )
   1213     {
   1214         if( NULL != p_pipe_info->recv_cmd)
   1215         {
   1216             status = p_pipe_info->recv_cmd( psHciContext,   pHwRef,
   1217                                                         pdata, length );
   1218         }
   1219         else
   1220         {
   1221             HCI_DEBUG(" Command Handling Not Supported by the #%u Pipe \n",
   1222                                                         pipe_id);
   1223             status = PHNFCSTVAL(CID_NFC_HCI,
   1224                                         NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1225         }
   1226     }
   1227     else
   1228     {
   1229         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1230     }
   1231 
   1232     HCI_DEBUG("HCI: In Function: %s \n", __FUNCTION__);
   1233     HCI_DEBUG("HCI: Response Pending status --> %s \n",
   1234         (psHciContext->response_pending)?"TRUE":"FALSE");
   1235 
   1236     if(( NFCSTATUS_SUCCESS == status )
   1237         && (TRUE != psHciContext->response_pending)
   1238         )
   1239     {
   1240         /* Reset the Pipe Information Stored in the particular Pipe */
   1241         /* phHciNfc_Reset_Pipe_MsgInfo(psHciContext->p_pipe_list[pipe_id]); */
   1242         /* Resume the Execution Sequence */
   1243         status = phHciNfc_Resume_Sequence(psHciContext, pHwRef);
   1244 
   1245     }/* End of Success Status validation */
   1246 
   1247     return status;
   1248 }
   1249 
   1250 
   1251 static
   1252 void
   1253 phHciNfc_Build_HCPMessage(
   1254                                 phHciNfc_HCP_Packet_t *hcp_packet,
   1255                                 uint8_t             msg_type,
   1256                                 uint8_t             instruction
   1257                           )
   1258 {
   1259     phHciNfc_HCP_Message_t  *hcp_message = NULL;
   1260 
   1261     hcp_message = &(hcp_packet->msg.message);
   1262     /* Set the type to the provided message type in the HCP Message Header */
   1263     hcp_message->msg_header = (uint8_t) SET_BITS8(hcp_message->msg_header,HCP_MSG_TYPE_OFFSET,
   1264                 HCP_MSG_TYPE_LEN, msg_type);
   1265     /* Set the instruction to the kind of instruction in the HCP Message Header */
   1266     hcp_message->msg_header  = (uint8_t) SET_BITS8(hcp_message->msg_header,HCP_MSG_INSTRUCTION_OFFSET,
   1267                 HCP_MSG_INSTRUCTION_LEN, instruction);
   1268     /* hcp_message->msg_header = hcp_message->msg_header | temp ; */
   1269 
   1270 }
   1271 
   1272 
   1273 static
   1274 void
   1275 phHciNfc_Build_HCPHeader(
   1276                                 phHciNfc_HCP_Packet_t *hcp_packet,
   1277                                 uint8_t             chainbit,
   1278                                 uint8_t             pipe_id
   1279                           )
   1280 {
   1281     /* Set the Chaining bit to the default type */
   1282     hcp_packet->hcp_header = (uint8_t) SET_BITS8(hcp_packet->hcp_header,
   1283                 HCP_CHAINBIT_OFFSET, HCP_CHAINBIT_LEN, chainbit);
   1284     /* Populate the Pipe ID to the HCP Header */
   1285     hcp_packet->hcp_header  = (uint8_t) SET_BITS8(hcp_packet->hcp_header,HCP_PIPEID_OFFSET,
   1286                 HCP_PIPEID_LEN, pipe_id);
   1287 
   1288 }
   1289 
   1290 /*!
   1291  * \brief Builds the HCP Frame Packet.
   1292  *
   1293  * This function builds the HCP Frame in the HCP packet format to send to the
   1294  * connected reader device.
   1295  */
   1296 
   1297 void
   1298  phHciNfc_Build_HCPFrame (
   1299                                 phHciNfc_HCP_Packet_t *hcp_packet,
   1300                                 uint8_t             chainbit,
   1301                                 uint8_t             pipe_id,
   1302                                 uint8_t             msg_type,
   1303                                 uint8_t             instruction
   1304                           )
   1305 {
   1306     /* Fills the HCP Header in the packet */
   1307     phHciNfc_Build_HCPHeader( hcp_packet,chainbit,pipe_id );
   1308     /* Fills the HCP Message in the packet */
   1309     phHciNfc_Build_HCPMessage( hcp_packet,msg_type,instruction );
   1310 }
   1311 
   1312 /*!
   1313  * \brief Appends the HCP Frame Packet.
   1314  *
   1315  * This function Appends the HCP Frame of the HCP packet to complete the
   1316  * entire HCP Packet.
   1317  */
   1318 
   1319 void
   1320  phHciNfc_Append_HCPFrame (
   1321 /*                              phHciNfc_sContext_t     *psHciContext, */
   1322                                 uint8_t                 *hcp_data,
   1323                                 uint16_t                hcp_index,
   1324                                 uint8_t                 *src_data,
   1325                                 uint16_t                src_len
   1326                           )
   1327 {
   1328     uint16_t src_index = 0;
   1329     if( (NULL != src_data)
   1330         /* && (hcp_index >= 0) */
   1331         && (src_len > 0)
   1332         )
   1333     {
   1334         for(src_index=0; src_index < src_len ; src_index++)
   1335         {
   1336             hcp_data[hcp_index + src_index] = src_data[src_index];
   1337         }
   1338     }
   1339     return;
   1340 }
   1341 
   1342 
   1343 /*!
   1344  * \brief Sends the Generic HCI Commands to the connected reader device.
   1345  *
   1346  * This function Sends the Generic HCI Command frames in the HCP packet format to the
   1347  * connected reader device.
   1348  */
   1349 
   1350  NFCSTATUS
   1351  phHciNfc_Send_Generic_Cmd (
   1352                                 phHciNfc_sContext_t *psHciContext,
   1353                                 void                *pHwRef,
   1354                                 uint8_t             pipe_id,
   1355                                 uint8_t             cmd
   1356                     )
   1357  {
   1358     phHciNfc_HCP_Packet_t   *hcp_packet = NULL;
   1359     phHciNfc_HCP_Message_t  *hcp_message = NULL;
   1360     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;
   1361     uint16_t                 length = 0;
   1362     uint16_t                 i=0;
   1363     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1364 
   1365     if((NULL == psHciContext)
   1366         || ( pipe_id > PHHCINFC_MAX_PIPE)
   1367         ||(NULL == psHciContext->p_pipe_list[pipe_id])
   1368       )
   1369     {
   1370         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1371         HCI_DEBUG("%s: Invalid Arguments passed \n",
   1372                                                 "phHciNfc_Send_Generic_Cmd");
   1373     }
   1374     else
   1375     {
   1376         p_pipe_info = (phHciNfc_Pipe_Info_t *)
   1377                                 psHciContext->p_pipe_list[pipe_id];
   1378         psHciContext->tx_total = 0 ;
   1379         length +=  HCP_HEADER_LEN ;
   1380         switch( cmd )
   1381         {
   1382             case ANY_SET_PARAMETER:
   1383             {
   1384 
   1385                 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
   1386                 /* Construct the HCP Frame */
   1387                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
   1388                                         (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
   1389                 hcp_message = &(hcp_packet->msg.message);
   1390                 hcp_message->payload[i++] = p_pipe_info->reg_index ;
   1391                 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
   1392                                             i, (uint8_t *)p_pipe_info->param_info,
   1393                                             p_pipe_info->param_length);
   1394                 length =(uint16_t)(length + i + p_pipe_info->param_length);
   1395                 break;
   1396             }
   1397             case ANY_GET_PARAMETER:
   1398             {
   1399 
   1400                 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
   1401                 /* Construct the HCP Frame */
   1402                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
   1403                                         (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
   1404                 hcp_message = &(hcp_packet->msg.message);
   1405                 hcp_message->payload[i++] = p_pipe_info->reg_index ;
   1406                 length =(uint16_t)(length + i);
   1407                 break;
   1408             }
   1409             case ANY_OPEN_PIPE:
   1410             case ANY_CLOSE_PIPE:
   1411             {
   1412 
   1413                 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
   1414                 /* Construct the HCP Frame */
   1415                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
   1416                                         (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
   1417                 break;
   1418             }
   1419             default:
   1420             {
   1421                 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED );
   1422                 HCI_DEBUG("%s: Statement Should Not Occur \n","phHciNfc_Send_Generic_Cmd");
   1423                 break;
   1424             }
   1425         }
   1426         if( NFCSTATUS_SUCCESS == status )
   1427         {
   1428             p_pipe_info->sent_msg_type = HCP_MSG_TYPE_COMMAND;
   1429             p_pipe_info->prev_msg = cmd;
   1430             psHciContext->tx_total = length;
   1431             psHciContext->response_pending = TRUE ;
   1432             /* Send the Constructed HCP packet to the lower layer */
   1433             status = phHciNfc_Send_HCP( psHciContext, pHwRef );
   1434             p_pipe_info->prev_status = NFCSTATUS_PENDING;
   1435         }
   1436     }
   1437 
   1438     return status;
   1439 }
   1440 
   1441 
   1442 /*!
   1443  * \brief Sets the parameter of the registers in a particular Pipe.
   1444  *
   1445  * This function configures the registers in a particular Pipe.
   1446  */
   1447 
   1448 NFCSTATUS
   1449 phHciNfc_Set_Param (
   1450                                 phHciNfc_sContext_t     *psHciContext,
   1451                                 void                    *pHwRef,
   1452                                 phHciNfc_Pipe_Info_t    *p_pipe_info,
   1453                                 uint8_t                 reg_index,
   1454                                 void                    *p_param,
   1455                                 uint16_t                 param_length
   1456                     )
   1457  {
   1458     NFCSTATUS               status = NFCSTATUS_SUCCESS ;
   1459 
   1460     if( (NULL == p_pipe_info)
   1461         || (NULL == p_param)
   1462         || (0 == param_length)
   1463         )
   1464     {
   1465         status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION );
   1466     }
   1467     else
   1468     {
   1469         p_pipe_info->param_info = (uint8_t *)p_param;
   1470         p_pipe_info->param_length =  param_length;
   1471         p_pipe_info->reg_index = reg_index;
   1472         status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
   1473             (uint8_t)p_pipe_info->pipe.pipe_id,
   1474                 (uint8_t)ANY_SET_PARAMETER);
   1475         p_pipe_info->prev_status = status;
   1476     }
   1477 
   1478     return status;
   1479  }
   1480 
   1481 
   1482 #if 0
   1483  /*!
   1484  * \brief Gets the parameter of the registers in a particular Pipe.
   1485  *
   1486  * This function configures the registers in a particular Pipe.
   1487  */
   1488 
   1489  NFCSTATUS
   1490  phHciNfc_Get_Param (
   1491                                 phHciNfc_sContext_t     *psHciContext,
   1492                                 void                    *pHwRef,
   1493                                 phHciNfc_Pipe_Info_t    *p_pipe_info,
   1494                                 uint8_t                 reg_index,
   1495                     )
   1496  {
   1497     NFCSTATUS               status = NFCSTATUS_SUCCESS ;
   1498 
   1499     return status;
   1500  }
   1501 #endif
   1502 
   1503 
   1504 void
   1505 phHciNfc_Send_Complete (
   1506                                 void                    *psContext,
   1507                                 void                    *pHwRef,
   1508                                 phNfc_sTransactionInfo_t *pInfo
   1509                        )
   1510 {
   1511     NFCSTATUS               status = NFCSTATUS_SUCCESS ;
   1512     uint16_t                length = 0;
   1513 
   1514     HCI_PRINT("HCI Send Completion....\n");
   1515     if ( (NULL != psContext)
   1516         && (NULL != pInfo)
   1517         && (NULL != pHwRef)
   1518         )
   1519     {
   1520         phHciNfc_sContext_t *psHciContext = (phHciNfc_sContext_t *)psContext;
   1521         status = pInfo->status ;
   1522         length = pInfo->length ;
   1523         /* HCI_DEBUG("HCI Lower Layer Send Completion Before Receive,\
   1524                                                 Status = %02X\n",status); */
   1525         if(status != NFCSTATUS_SUCCESS)
   1526         {
   1527             /* Handle the Error Scenario */
   1528             (void)memset(psHciContext->send_buffer,
   1529                                             FALSE, PHHCINFC_MAX_BUFFERSIZE);
   1530             /* psHciContext->hci_transact_state = NFC_TRANSACT_COMPLETE;*/
   1531             phHciNfc_Error_Sequence( psHciContext, pHwRef, status, NULL, 0 );
   1532         }
   1533         else
   1534         {
   1535 	        HCI_DEBUG("HCI Send Completion... Length = %02X\n", length);
   1536             /* To complete the send complete with the send
   1537              * or receive with chaining.
   1538              */
   1539             if( (TRUE == psHciContext->tx_hcp_chaining)
   1540                 &&( psHciContext->tx_remain > HCP_ZERO_LEN ))
   1541             {
   1542                 /* Skip the HCP Header Byte Sent */
   1543                 psHciContext->tx_remain -= length - 1;
   1544 
   1545                 /* Skip the HCP Header Byte Sent */
   1546                 psHciContext->tx_hcp_frgmnt_index += length - 1;
   1547 
   1548                 /* Send the Remaining HCP Data Frames */
   1549                 status = phHciNfc_Send_HCP( psHciContext, pHwRef );
   1550 
   1551                 HCI_DEBUG("HCI (Chaining) Send Resume: Status = %02X\n", status);
   1552 
   1553                 if( ( NFCSTATUS_SUCCESS != status )
   1554                     && (NFCSTATUS_PENDING != status )
   1555                     )
   1556                 {
   1557                     phHciNfc_Error_Sequence( psHciContext, pHwRef, status, NULL, 0 );
   1558                 }/* End of the Status check */
   1559             }
   1560             else
   1561             {
   1562                 psHciContext->tx_total = HCP_ZERO_LEN ;
   1563                 psHciContext->tx_remain = HCP_ZERO_LEN ;
   1564                 psHciContext->tx_hcp_frgmnt_index = HCP_ZERO_LEN ;
   1565                 HCI_DEBUG("HCI: %s: response_pending=%s, event_pending=%s",
   1566                         __FUNCTION__,
   1567                         (psHciContext->response_pending)?"TRUE":"FALSE",
   1568                         (psHciContext->event_pending)?"TRUE":"FALSE"
   1569                          );
   1570                 if ((TRUE == psHciContext->response_pending)
   1571                     || (TRUE == psHciContext->event_pending))
   1572                 {
   1573                     (void) memset(psHciContext->recv_buffer,
   1574                         FALSE, PHHCINFC_MAX_BUFFERSIZE);
   1575                     (void) memset((void *)&psHciContext->rx_packet,
   1576                         FALSE, sizeof(phHciNfc_HCP_Packet_t));
   1577 
   1578                     /* Reset the Received Data Index */
   1579                     psHciContext->rx_index = ZERO;
   1580                     /* Reset the size of the total response data received */
   1581                     psHciContext->rx_total = ZERO;
   1582 
   1583                     /* psHciContext->hci_transact_state = NFC_TRANSACT_SEND_COMPLETE;*/
   1584                     /* Receive the Response Packet */
   1585                     status = phHciNfc_Receive( psHciContext, pHwRef,
   1586                                 (uint8_t *)(&psHciContext->rx_packet),
   1587                                 sizeof(phHciNfc_HCP_Packet_t) );
   1588 
   1589                     /* HCI_DEBUG("HCI Lower Layer Send Completion After Receive,\
   1590                     Status = %02X\n",status); */
   1591 
   1592                     if( ( NFCSTATUS_SUCCESS != status )
   1593                          && (NFCSTATUS_PENDING != status )
   1594                         )
   1595                     {
   1596                         phHciNfc_Error_Sequence( psHciContext, pHwRef, status, NULL, 0 );
   1597                     }/* End of the Status check */
   1598                 }
   1599                 else
   1600                 {
   1601                     status = phHciNfc_Resume_Sequence(psHciContext, pHwRef );
   1602                 }
   1603             }
   1604 
   1605         } /* End of status != Success */
   1606 
   1607     } /* End of Context != NULL  */
   1608 }
   1609 
   1610 
   1611 void
   1612 phHciNfc_Receive_Complete (
   1613                                 void                    *psContext,
   1614                                 void                    *pHwRef,
   1615                                 phNfc_sTransactionInfo_t *pInfo
   1616                                 )
   1617 {
   1618     NFCSTATUS               status = NFCSTATUS_SUCCESS ;
   1619     void                    *pdata = NULL ;
   1620     uint16_t                length = 0 ;
   1621 
   1622     HCI_PRINT("HCI Receive Completion....\n");
   1623     if ( (NULL != psContext)
   1624         && (NULL != pInfo)
   1625         && (NULL != pHwRef)
   1626         )
   1627     {
   1628         phHciNfc_sContext_t *psHciContext = (phHciNfc_sContext_t *)psContext;
   1629 
   1630         status = pInfo->status ;
   1631         pdata = pInfo->buffer ;
   1632         length = pInfo->length ;
   1633         HCI_DEBUG("HCI Lower Layer Receive Completion, Status = %02X\n",status);
   1634         if( NFCSTATUS_SUCCESS != status )
   1635         {
   1636             /* Handle the Error Scenario */
   1637             /* psHciContext->hci_transact_state = NFC_TRANSACT_COMPLETE; */
   1638             phHciNfc_Error_Sequence(psHciContext, pHwRef, status , pdata, (uint8_t)length );
   1639         }
   1640         else
   1641         {
   1642              /* Receive the remaining Response Packet */
   1643             /* psHciContext->hci_transact_state = NFC_TRANSACT_RECV_COMPLETE; */
   1644             status = phHciNfc_Process_HCP( psHciContext, pHwRef, pdata,(uint8_t) length );
   1645             if( ( NFCSTATUS_SUCCESS != status )
   1646                 && (NFCSTATUS_PENDING != status )
   1647               )
   1648             {
   1649                 phHciNfc_Error_Sequence(psHciContext, pHwRef, status , pdata, (uint8_t) length );
   1650             }
   1651         }
   1652     }
   1653 }
   1654 
   1655 void
   1656 phHciNfc_Notify(
   1657                     pphNfcIF_Notification_CB_t  p_upper_notify,
   1658                     void                        *p_upper_context,
   1659                     void                        *pHwRef,
   1660                     uint8_t                     type,
   1661                     void                        *pInfo
   1662                )
   1663 {
   1664     if( ( NULL != p_upper_notify) )
   1665     {
   1666         /* Notify the to the Upper Layer */
   1667         (p_upper_notify)(p_upper_context, pHwRef, type, pInfo);
   1668     }
   1669 
   1670 }
   1671 
   1672 
   1673 void
   1674 phHciNfc_Tag_Notify(
   1675                             phHciNfc_sContext_t     *psHciContext,
   1676                             void                    *pHwRef,
   1677                             uint8_t                 type,
   1678                             void                    *pInfo
   1679                )
   1680 {
   1681     phNfc_sCompletionInfo_t *psCompInfo =
   1682                                 (phNfc_sCompletionInfo_t *)pInfo;
   1683     pphNfcIF_Notification_CB_t  p_upper_notify = psHciContext->p_upper_notify;
   1684     void                        *pcontext = psHciContext->p_upper_context;
   1685     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1686 
   1687     switch( psHciContext->hci_state.next_state )
   1688     {
   1689         case hciState_Activate:
   1690         {
   1691             /* Roll Back to the Select State */
   1692             phHciNfc_FSM_Rollback(psHciContext);
   1693             break;
   1694         }
   1695         case hciState_Select:
   1696         {
   1697             status = phHciNfc_FSM_Complete(psHciContext);
   1698             break;
   1699         }
   1700         default:
   1701         {
   1702             /* Roll Back to the Select State */
   1703             phHciNfc_FSM_Rollback(psHciContext);
   1704             break;
   1705         }
   1706 
   1707     }
   1708 
   1709     if(NFCSTATUS_SUCCESS == status )
   1710     {
   1711             /* Notify the Tag Events to the Upper layer */
   1712         phHciNfc_Notify( p_upper_notify, pcontext , pHwRef,
   1713                                 type, psCompInfo);
   1714     }
   1715     else
   1716     {
   1717         phHciNfc_Error_Sequence( psHciContext, pHwRef, status, NULL, 0 );
   1718     }
   1719 }
   1720 
   1721 
   1722 void
   1723 phHciNfc_Target_Select_Notify(
   1724                             phHciNfc_sContext_t     *psHciContext,
   1725                             void                    *pHwRef,
   1726                             uint8_t                 type,
   1727                             void                    *pInfo
   1728                )
   1729 {
   1730     phNfc_sCompletionInfo_t *psCompInfo =
   1731                                 (phNfc_sCompletionInfo_t *)pInfo;
   1732     pphNfcIF_Notification_CB_t  p_upper_notify = psHciContext->p_upper_notify;
   1733     void                        *pcontext = psHciContext->p_upper_context;
   1734     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1735 
   1736     switch( psHciContext->hci_state.next_state )
   1737     {
   1738         case hciState_Listen:
   1739         {
   1740             /* Roll Back to the Select State */
   1741             status = phHciNfc_FSM_Complete(psHciContext);
   1742             break;
   1743         }
   1744         case hciState_Select:
   1745         {
   1746             status = phHciNfc_FSM_Complete(psHciContext);
   1747             break;
   1748         }
   1749         default:
   1750         {
   1751             /* Roll Back to the Select State */
   1752             phHciNfc_FSM_Rollback(psHciContext);
   1753             break;
   1754         }
   1755 
   1756     }
   1757 
   1758     if(NFCSTATUS_SUCCESS == status )
   1759     {
   1760             /* Notify the Tag Events to the Upper layer */
   1761         phHciNfc_Notify( p_upper_notify, pcontext , pHwRef,
   1762                                 type, psCompInfo);
   1763     }
   1764     else
   1765     {
   1766         phHciNfc_Error_Sequence( psHciContext, pHwRef, status, NULL, 0 );
   1767     }
   1768 
   1769 }
   1770 
   1771 
   1772 
   1773 
   1774 void
   1775 phHciNfc_Release_Notify(
   1776                             phHciNfc_sContext_t     *psHciContext,
   1777                             void                    *pHwRef,
   1778                             uint8_t                 type,
   1779                             void                    *pInfo
   1780                )
   1781 {
   1782     phNfc_sCompletionInfo_t *psCompInfo =
   1783                                 (phNfc_sCompletionInfo_t *)pInfo;
   1784     pphNfcIF_Notification_CB_t  p_upper_notify = psHciContext->p_upper_notify;
   1785     void                        *pcontext = psHciContext->p_upper_context;
   1786     phHciNfc_Release_Resources( &psHciContext );
   1787         /* Notify the Failure to the Upper Layer */
   1788     phHciNfc_Notify( p_upper_notify, pcontext , pHwRef,
   1789                             type, psCompInfo);
   1790 }
   1791 
   1792 
   1793 void
   1794 phHciNfc_Notify_Event(
   1795                             void                    *psContext,
   1796                             void                    *pHwRef,
   1797                             uint8_t                 type,
   1798                             void                    *pInfo
   1799                     )
   1800 {
   1801     NFCSTATUS            status = NFCSTATUS_SUCCESS;
   1802 
   1803     if ( (NULL != psContext)
   1804         && (NULL != pInfo)
   1805         && (NULL != pHwRef)
   1806         )
   1807     {
   1808         phHciNfc_sContext_t *psHciContext = (phHciNfc_sContext_t *)psContext;
   1809 
   1810         /* Process based on the Notification type */
   1811         switch(type)
   1812         {
   1813             case NFC_NOTIFY_INIT_COMPLETED:
   1814             {
   1815                 phNfc_sCompletionInfo_t *psCompInfo =
   1816                                             (phNfc_sCompletionInfo_t *)pInfo;
   1817                 if(NFCSTATUS_SUCCESS == psCompInfo->status)
   1818                 {
   1819 
   1820 #if  (NXP_NFC_HCI_TIMER == 1)
   1821                     if ( NXP_INVALID_TIMER_ID == hci_resp_timer_id )
   1822                     {
   1823                         /* Create and Intialise the Response Timer */
   1824                         hci_resp_timer_id = phOsalNfc_Timer_Create( );
   1825                         HCI_DEBUG(" HCI : Timer %X Created \n",
   1826                                                             hci_resp_timer_id);
   1827                     }
   1828                     else
   1829                     {
   1830                         HCI_DEBUG(" HCI : Timer Already Created, Timer ID : %X\n",
   1831                                                                 hci_resp_timer_id);
   1832                     }
   1833                     gpsHciContext = psHciContext;
   1834 
   1835 #endif /* (NXP_NFC_HCI_TIMER == 1) */
   1836 
   1837                      /* Complete the Initialisation Sequence */
   1838                     status = phHciNfc_Resume_Sequence(psContext ,pHwRef);
   1839                 }
   1840                 else
   1841                 {
   1842                     /* Notify the Error Scenario to the Upper Layer */
   1843                     phHciNfc_Notify(psHciContext->p_upper_notify,
   1844                                     psHciContext->p_upper_context, pHwRef,
   1845                                             NFC_NOTIFY_ERROR, psCompInfo);
   1846                 }
   1847                 break;
   1848             }
   1849             case NFC_NOTIFY_INIT_FAILED:
   1850             {
   1851                  /* Notify the Failure to the Upper Layer */
   1852                 phHciNfc_Release_Notify( psContext,pHwRef,
   1853                                         type, pInfo );
   1854                 break;
   1855             }
   1856             case NFC_NOTIFY_RECV_COMPLETED:
   1857             {
   1858                 /* Receive Completed from the Lower Layer */
   1859                 phHciNfc_Receive_Complete(psContext,pHwRef,pInfo);
   1860 
   1861                 break;
   1862             }
   1863             case NFC_NOTIFY_SEND_COMPLETED:
   1864             {
   1865                 /* Receive Completed from the Lower Layer */
   1866                 phHciNfc_Send_Complete(psContext,pHwRef,pInfo);
   1867 
   1868                 break;
   1869             }
   1870             case NFC_NOTIFY_TRANSCEIVE_COMPLETED:
   1871             {
   1872                 /* TODO: TO handle Both Send and Receive Complete */
   1873                 break;
   1874             }
   1875             case NFC_NOTIFY_TARGET_DISCOVERED:
   1876             {
   1877                 HCI_PRINT(" PICC Discovery ! Obtain PICC Info .... \n");
   1878                 /* psHciContext->hci_seq = PL_DURATION_SEQ; */
   1879                 if ( hciState_Unknown == psHciContext->hci_state.next_state )
   1880                 {
   1881 
   1882                     status = phHciNfc_FSM_Update ( psHciContext, hciState_Select );
   1883 
   1884 
   1885                     if (NFCSTATUS_SUCCESS != status)
   1886                     {
   1887                        status = phHciNfc_ReaderMgmt_Deselect(
   1888                             psHciContext, pHwRef, phHal_eISO14443_A_PICC, FALSE);
   1889                     }
   1890                 }
   1891                 else
   1892                 {
   1893 #ifdef SW_RELEASE_TARGET
   1894                     /*status = phHciNfc_ReaderMgmt_Deselect(
   1895                         psHciContext, pHwRef, phHal_eISO14443_A_PICC, FALSE); */
   1896                     psHciContext->target_release = TRUE;
   1897 #else
   1898                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
   1899 #endif
   1900                 }
   1901                 break;
   1902             }
   1903             /* To Notify the Target Released Notification
   1904              * to the Above Layer */
   1905             case NFC_NOTIFY_TARGET_RELEASED:
   1906             /* To Notify the NFC Secure Element Transaction
   1907              * Information to the Above Layer */
   1908             /* case NFC_NOTIFY_TRANSACTION: */
   1909             /* To Notify the Generic Events To the Upper
   1910              * Layer */
   1911             case NFC_NOTIFY_EVENT:
   1912             /* To Notify the Data Receive  Notification
   1913              * to the Above Layer */
   1914             case NFC_NOTIFY_RECV_EVENT:
   1915             {
   1916                 phNfc_sCompletionInfo_t *psCompInfo =
   1917 		                (phNfc_sCompletionInfo_t *)pInfo;
   1918 
   1919                 if (((TRUE == psHciContext->event_pending) ||
   1920                     (NFCSTATUS_RF_TIMEOUT == psCompInfo->status))
   1921                     && ( hciState_Transact == psHciContext->hci_state.next_state))
   1922                 {
   1923                     /* Rollback due to Transmission Error */
   1924                     phHciNfc_FSM_Rollback(psHciContext);
   1925                 }
   1926                 psHciContext->event_pending = FALSE;
   1927                 phHciNfc_Notify(psHciContext->p_upper_notify,
   1928                             psHciContext->p_upper_context, pHwRef,
   1929                                 type, pInfo);
   1930                 break;
   1931             }
   1932             case NFC_NOTIFY_DEVICE_ACTIVATED:
   1933             {
   1934                 HCI_PRINT("  Device Activated! Obtaining Remote Reader Info .... \n");
   1935                 if ( hciState_Unknown == psHciContext->hci_state.next_state )
   1936                 {
   1937                     switch (psHciContext->host_rf_type)
   1938                     {
   1939                         case phHal_eISO14443_A_PCD:
   1940                         case phHal_eISO14443_B_PCD:
   1941                         case phHal_eISO14443_BPrime_PCD:
   1942                         case phHal_eFelica_PCD:
   1943                         {
   1944                             break;
   1945                         }
   1946                         case phHal_eNfcIP1_Initiator:
   1947                         case phHal_eNfcIP1_Target:
   1948                         {
   1949                             break;
   1950                         }
   1951                         case phHal_eUnknown_DevType:
   1952                         default:
   1953                         {
   1954                             status = PHNFCSTVAL(CID_NFC_HCI,
   1955                                         NFCSTATUS_INVALID_PARAMETER);
   1956                             break;
   1957                         }
   1958 
   1959                     }
   1960                     status = phHciNfc_FSM_Update ( psHciContext, hciState_Listen );
   1961                 }
   1962                 else
   1963                 {
   1964                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
   1965                 }
   1966                 break;
   1967             }
   1968             case NFC_NOTIFY_DEVICE_DEACTIVATED:
   1969             {
   1970                 HCI_PRINT(" Device De-Activated! \n");
   1971                 if ( hciState_Unknown == psHciContext->hci_state.next_state )
   1972                 {
   1973                     status = phHciNfc_FSM_Update ( psHciContext, hciState_Initialise );
   1974                     if(NFCSTATUS_SUCCESS == status)
   1975                     {
   1976                         /* Complete to the Select State */
   1977                         status = phHciNfc_FSM_Complete(psHciContext);
   1978                     }
   1979                     else
   1980                     {
   1981                         HCI_PRINT(" Device Deactivated.. But Invalid State \n");
   1982                         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
   1983                     }
   1984                 }
   1985                 else
   1986                 {
   1987                     status = phHciNfc_ReaderMgmt_Update_Sequence(
   1988                                                 psHciContext, INFO_SEQ );
   1989 
   1990                     if(( hciState_Listen == psHciContext->hci_state.next_state)
   1991                         || (hciState_Transact == psHciContext->hci_state.next_state))
   1992                     {
   1993                         psHciContext->hci_state.next_state = hciState_Initialise;
   1994                         /* Roll Back to the Default State */
   1995                         status = phHciNfc_FSM_Complete(psHciContext);
   1996                     }
   1997                 }
   1998                 psHciContext->event_pending = FALSE;
   1999                 phHciNfc_Notify(psHciContext->p_upper_notify,
   2000                             psHciContext->p_upper_context, pHwRef,
   2001                             NFC_NOTIFY_EVENT, pInfo);
   2002                 break;
   2003             }
   2004             case NFC_NOTIFY_DEVICE_ERROR:
   2005             {
   2006                 phNfc_sCompletionInfo_t *psCompInfo =
   2007                                             (phNfc_sCompletionInfo_t *)pInfo;
   2008 
   2009                 psCompInfo->status = ( NFCSTATUS_BOARD_COMMUNICATION_ERROR
   2010                                         != PHNFCSTATUS(psCompInfo->status))?
   2011                                             NFCSTATUS_BOARD_COMMUNICATION_ERROR:
   2012                                                 psCompInfo->status ;
   2013 
   2014 #if  (NXP_NFC_HCI_TIMER == 1)
   2015 
   2016                 if ( NXP_INVALID_TIMER_ID != hci_resp_timer_id )
   2017                 {
   2018                     HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X",
   2019                                                           psCompInfo->status);
   2020                     /* Stop and Un-Intialise the Response Timer */
   2021                     phOsalNfc_Timer_Stop( hci_resp_timer_id );
   2022                 }
   2023 
   2024 #endif /* (NXP_NFC_HCI_TIMER == 1) */
   2025 
   2026                 phHciNfc_Notify(psHciContext->p_upper_notify,
   2027                             psHciContext->p_upper_context, pHwRef,
   2028                             (uint8_t) NFC_NOTIFY_DEVICE_ERROR, pInfo);
   2029 
   2030                 break;
   2031             }
   2032 
   2033             case NFC_NOTIFY_ERROR:
   2034             default:
   2035             {
   2036                 phNfc_sCompletionInfo_t *psCompInfo =
   2037                                             (phNfc_sCompletionInfo_t *)pInfo;
   2038 
   2039 #if  (NXP_NFC_HCI_TIMER == 1)
   2040 
   2041                 if (( NFCSTATUS_BOARD_COMMUNICATION_ERROR == PHNFCSTATUS(psCompInfo->status))
   2042                         && ( NXP_INVALID_TIMER_ID != hci_resp_timer_id ))
   2043                 {
   2044                     HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X",
   2045                                                           psCompInfo->status);
   2046                     /* Stop the HCI Response Timer */
   2047                     phOsalNfc_Timer_Stop( hci_resp_timer_id );
   2048                 }
   2049 
   2050 #endif /* (NXP_NFC_HCI_TIMER == 1) */
   2051 
   2052                 phHciNfc_Error_Sequence( psHciContext, pHwRef,
   2053                                                         psCompInfo->status, NULL, 0);
   2054                 break;
   2055             }
   2056         } /* End of Switch */
   2057     } /* End of Context != NULL  */
   2058 }
   2059 
   2060