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_WI.c                                                        *
     22 * \brief HCI WI gate Management Routines.                                     *
     23 *                                                                             *
     24 *                                                                             *
     25 * Project: NFC-FRI-1.1                                                        *
     26 *                                                                             *
     27 * $Date: Tue Aug 18 10:22:34 2009 $                                           *
     28 * $Author: ing04880 $                                                         *
     29 * $Revision: 1.33 $                                                            *
     30 * $Aliases: NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,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 ***************************** Header File Inclusion ****************************
     36 */
     37 #include <phNfcCompId.h>
     38 #include <phHciNfc_Pipe.h>
     39 #include <phHciNfc_WI.h>
     40 #include <phOsalNfc.h>
     41 #include <phHciNfc_Emulation.h>
     42 /*
     43 ****************************** Macro Definitions *******************************
     44 */
     45 /*  WI gate specific Events definition */
     46 #define NXP_EVT_SE_START_OF_TRANSACTION (0x01U)
     47 #define NXP_EVT_SE_END_OF_TRANSACTION   (0x02U)
     48 #define NXP_EVT_SE_SWITCH_MODE          (0x03U)
     49 #define NXP_EVT_SE_TRANSACTION          (0x04U)
     50 
     51 /* WI Gate registry Settings */
     52 /* set default mode mode as virtual mode */
     53 #define NXP_SE_DEFAULTMODE_INDEX        (0x01)
     54 #define NXP_SE_EVENTS_INDEX             (0x05)
     55 
     56 /* Set Bit 0 and Bit 1 to report Start of transaction and End of transaction*/
     57 #define WI_ENABLE_EVENTS                (0x04)
     58 #define WI_VIRTUALMODE                  (0x01)
     59 #define WI_OFFMODE                      (0x00)
     60 #define AID_SIZE                        (0x20)
     61 /****************** Structure and Enumeration ****************************/
     62 
     63 
     64 /****************** Static Function Declaration **************************/
     65 
     66 static uint8_t paypass_removal[2]          = {0x50, 0x00};
     67 static uint8_t mifare_access               = 0x60;
     68 
     69 static
     70 NFCSTATUS
     71 phHciNfc_Recv_WI_Response(
     72                               void  *psContext,
     73                               void  *pHwRef,
     74                               uint8_t *pResponse,
     75 #ifdef ONE_BYTE_LEN
     76                               uint8_t            length
     77 #else
     78                               uint16_t           length
     79 #endif
     80                          );
     81 
     82 static
     83 NFCSTATUS
     84 phHciNfc_Recv_WI_Event(
     85                         void    *psContext,
     86                         void    *pHwRef,
     87                         uint8_t *pEvent,
     88 #ifdef ONE_BYTE_LEN
     89                         uint8_t            length
     90 #else
     91                         uint16_t           length
     92 #endif
     93                     );
     94 
     95 static
     96 NFCSTATUS
     97 phHciNfc_Send_WI_Event(
     98                         phHciNfc_sContext_t     *psHciContext,
     99                         void                    *pHwRef,
    100                         uint8_t                 pipe_id,
    101                         uint8_t                 event
    102                     );
    103 
    104 static
    105 NFCSTATUS
    106 phHciNfc_WI_InfoUpdate(
    107                             phHciNfc_sContext_t     *psHciContext,
    108                             uint8_t                 index,
    109                             uint8_t                 *reg_value,
    110                             uint8_t                 reg_length
    111                             );
    112 
    113 
    114 #if defined (WI_UPDATE_SEQ)
    115 static
    116 NFCSTATUS
    117 phHciNfc_WI_Update_Sequence(
    118                                 phHciNfc_sContext_t     *psHciContext,
    119                                 phHciNfc_eSeqType_t     WI_seq
    120                          );
    121 #endif /* #if defined (WI_UPDATE_SEQ) */
    122 
    123 /*
    124 *************************** Function Definitions ***************************
    125 */
    126 
    127 
    128 
    129 NFCSTATUS
    130 phHciNfc_WI_Init_Resources(
    131                            phHciNfc_sContext_t  *psHciContext
    132                           )
    133 {
    134     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    135     phHciNfc_WI_Info_t          *p_WI_info=NULL;
    136 
    137     if( NULL == psHciContext )
    138     {
    139         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    140     }
    141     else
    142     {
    143         if(( NULL == psHciContext->p_wi_info ) &&
    144              (phHciNfc_Allocate_Resource((void **)(&p_WI_info),
    145             sizeof(phHciNfc_WI_Info_t))== NFCSTATUS_SUCCESS))
    146         {
    147             psHciContext->p_wi_info = p_WI_info;
    148             p_WI_info->current_seq = eWI_PipeOpen;
    149             p_WI_info->next_seq = eWI_PipeOpen;
    150             p_WI_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
    151         }
    152         else
    153         {
    154             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
    155         }
    156 
    157     }
    158     return status;
    159 }
    160 
    161 NFCSTATUS
    162 phHciNfc_WI_Get_PipeID(
    163                             phHciNfc_sContext_t        *psHciContext,
    164                             uint8_t                    *ppipe_id
    165                             )
    166 {
    167     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    168 
    169     if( (NULL != psHciContext)
    170         && ( NULL != ppipe_id )
    171         && ( NULL != psHciContext->p_wi_info )
    172         )
    173     {
    174         phHciNfc_WI_Info_t     *p_wi_info=NULL;
    175         p_wi_info = (phHciNfc_WI_Info_t *)
    176             psHciContext->p_wi_info ;
    177         *ppipe_id =  p_wi_info->pipe_id  ;
    178     }
    179     else
    180     {
    181         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    182     }
    183     return status;
    184 }
    185 
    186 
    187 NFCSTATUS
    188 phHciNfc_WI_Update_PipeInfo(
    189                                   phHciNfc_sContext_t     *psHciContext,
    190                                   uint8_t                 pipeID,
    191                                   phHciNfc_Pipe_Info_t    *pPipeInfo
    192                            )
    193 {
    194     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    195 
    196     if( NULL == psHciContext )
    197     {
    198         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    199     }
    200     else if(NULL == psHciContext->p_wi_info)
    201     {
    202         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    203     }
    204     else
    205     {
    206         phHciNfc_WI_Info_t *p_WI_info=NULL;
    207         p_WI_info = (phHciNfc_WI_Info_t *)
    208                                 psHciContext->p_wi_info ;
    209         /* Update the pipe_id of the WI Gate obtained from HCI Response */
    210         p_WI_info->pipe_id = pipeID;
    211         p_WI_info->p_pipe_info = pPipeInfo;
    212         if ( NULL != pPipeInfo)
    213         {
    214             /* Update the Response Receive routine of the WI Gate */
    215             pPipeInfo->recv_resp = &phHciNfc_Recv_WI_Response;
    216             /* Update the event Receive routine of the WI Gate */
    217             pPipeInfo->recv_event = &phHciNfc_Recv_WI_Event;
    218         }
    219     }
    220 
    221     return status;
    222 }
    223 
    224 #if defined (WI_UPDATE_SEQ)
    225 static
    226 NFCSTATUS
    227 phHciNfc_WI_Update_Sequence(
    228                                 phHciNfc_sContext_t     *psHciContext,
    229                                 phHciNfc_eSeqType_t     WI_seq
    230                              )
    231 {
    232     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    233     phHciNfc_WI_Info_t          *p_WI_info=NULL;
    234     if( NULL == psHciContext )
    235     {
    236         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    237     }
    238     else if ( NULL == psHciContext->p_wi_info )
    239     {
    240         status = PHNFCSTVAL(CID_NFC_HCI,
    241                         NFCSTATUS_INVALID_HCI_INFORMATION);
    242     }
    243     else
    244     {
    245         p_WI_info = (phHciNfc_WI_Info_t *)
    246                             psHciContext->p_wi_info ;
    247         switch(WI_seq)
    248         {
    249             case RESET_SEQ:
    250             case INIT_SEQ:
    251             {
    252                 p_WI_info->current_seq = eWI_PipeOpen;
    253                 p_WI_info->next_seq = eWI_SetDefaultMode ;
    254             }break;
    255             case UPDATE_SEQ:
    256             {
    257                 p_WI_info->current_seq = p_WI_info->next_seq;
    258 
    259             }break;
    260             case REL_SEQ:
    261             {
    262                 p_WI_info->current_seq = eWI_PipeOpen;
    263                 p_WI_info->next_seq = eWI_PipeClose ;
    264             }break;
    265             default:
    266             {
    267                 break;
    268             }
    269         }/* End of Update Sequence Switch */
    270     }
    271     return status;
    272 
    273 }
    274 #endif /* #if defined (WI_UPDATE_SEQ) */
    275 
    276 NFCSTATUS
    277 phHciNfc_WI_Configure_Default(
    278                               void                  *psHciHandle,
    279                               void                  *pHwRef,
    280                               uint8_t               enable_type
    281                           )
    282 {
    283     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    284     static uint8_t          param = 0;
    285     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    286 
    287     if( (NULL == psHciContext)||(NULL == pHwRef))
    288     {
    289       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    290     }
    291     else if ( NULL == psHciContext->p_wi_info )
    292     {
    293         status = PHNFCSTVAL(CID_NFC_HCI,
    294                         NFCSTATUS_INVALID_HCI_INFORMATION);
    295     }
    296     else
    297     {
    298         phHciNfc_WI_Info_t          *p_wi_info=NULL;
    299         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
    300 
    301         p_wi_info = (phHciNfc_WI_Info_t*)psHciContext->p_wi_info;
    302 
    303         p_pipe_info = p_wi_info->p_pipe_info;
    304         if(NULL == p_pipe_info)
    305         {
    306             status = PHNFCSTVAL(CID_NFC_HCI,
    307                             NFCSTATUS_INVALID_HCI_INFORMATION);
    308         }
    309         else
    310         {
    311             p_pipe_info->reg_index = NXP_SE_DEFAULTMODE_INDEX;
    312             /* Enable/Disable Default Virtual Mode for SmartMx */
    313             param = (uint8_t)enable_type;
    314             p_pipe_info->param_info =(void*)&param ;
    315             p_pipe_info->param_length = sizeof(param) ;
    316             status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
    317                                     p_wi_info->pipe_id,(uint8_t)ANY_SET_PARAMETER);
    318 
    319         }/* End of else part*/
    320     }
    321     return status;
    322 }
    323 
    324 NFCSTATUS
    325 phHciNfc_WI_Get_Default(
    326                               void                  *psHciHandle,
    327                               void                  *pHwRef
    328                               )
    329 {
    330     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    331     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    332 
    333     if( (NULL == psHciContext)||(NULL == pHwRef))
    334     {
    335         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    336     }
    337     else if ( NULL == psHciContext->p_wi_info )
    338     {
    339         status = PHNFCSTVAL(CID_NFC_HCI,
    340                             NFCSTATUS_INVALID_HCI_INFORMATION);
    341     }
    342     else
    343     {
    344         phHciNfc_WI_Info_t          *p_wiinfo=NULL;
    345         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
    346 
    347         p_wiinfo = (phHciNfc_WI_Info_t*)psHciContext->p_wi_info;
    348 
    349         p_pipe_info = p_wiinfo->p_pipe_info;
    350         if(NULL == p_pipe_info)
    351         {
    352             status = PHNFCSTVAL(CID_NFC_HCI,
    353                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    354         }
    355         else
    356         {
    357             p_pipe_info->reg_index = NXP_SE_DEFAULTMODE_INDEX;
    358 
    359             status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
    360                                             p_wiinfo->pipe_id,
    361                                             (uint8_t)ANY_GET_PARAMETER);
    362 
    363         }/* End of else part*/
    364     }
    365     return status;
    366 }
    367 
    368 
    369 NFCSTATUS
    370 phHciNfc_WI_Configure_Mode(
    371                               void                *psHciHandle,
    372                               void                *pHwRef,
    373                               phHal_eSmartMX_Mode_t   e_smx_mode
    374                           )
    375 {
    376     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    377     static uint8_t          param = 0;
    378     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    379 
    380     if( (NULL == psHciContext)||(NULL == pHwRef))
    381     {
    382       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    383     }
    384     else if ( NULL == psHciContext->p_wi_info )
    385     {
    386         status = PHNFCSTVAL(CID_NFC_HCI,
    387                         NFCSTATUS_INVALID_HCI_INFORMATION);
    388     }
    389     else
    390     {
    391         phHciNfc_WI_Info_t          *p_wi_info=NULL;
    392         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
    393 
    394         p_wi_info = (phHciNfc_WI_Info_t*)psHciContext->p_wi_info;
    395 
    396         p_pipe_info = p_wi_info->p_pipe_info;
    397         if(NULL == p_pipe_info)
    398         {
    399             status = PHNFCSTVAL(CID_NFC_HCI,
    400                             NFCSTATUS_INVALID_HCI_INFORMATION);
    401         }
    402         else
    403         {
    404             /* Switch the Mode of the SmartMx */
    405             param = (uint8_t)e_smx_mode;
    406             p_pipe_info->param_info =(void*)&param ;
    407             p_pipe_info->param_length = sizeof(param) ;
    408             status = phHciNfc_Send_WI_Event( psHciContext, pHwRef,
    409                                 p_wi_info->pipe_id, NXP_EVT_SE_SWITCH_MODE );
    410             /* Send the Success Status as this is an event */
    411             status = ( (status == NFCSTATUS_PENDING)?
    412                                 NFCSTATUS_SUCCESS : status);
    413 
    414         }/* End of else part*/
    415     }
    416     return status;
    417 }
    418 
    419 
    420 NFCSTATUS
    421 phHciNfc_WI_Configure_Notifications(
    422                                     void        *psHciHandle,
    423                                     void        *pHwRef,
    424                                     phHciNfc_WI_Events_t eNotification
    425                                 )
    426 {
    427     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    428     static uint8_t          param = 0;
    429     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    430 
    431     if( (NULL == psHciContext)||(NULL == pHwRef))
    432     {
    433       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    434     }
    435     else if ( NULL == psHciContext->p_wi_info )
    436     {
    437         status = PHNFCSTVAL(CID_NFC_HCI,
    438                         NFCSTATUS_INVALID_HCI_INFORMATION);
    439     }
    440     else
    441     {
    442         phHciNfc_WI_Info_t          *p_wi_info=NULL;
    443         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
    444 
    445 
    446         p_wi_info = (phHciNfc_WI_Info_t*)psHciContext->p_wi_info;
    447         p_pipe_info = p_wi_info->p_pipe_info;
    448         if(NULL == p_pipe_info)
    449         {
    450             status = PHNFCSTVAL(CID_NFC_HCI,
    451                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    452         }
    453         else
    454         {
    455             if(eEnableEvents == eNotification)
    456             {
    457                 /* Enable start and end of transaction events*/
    458                 param = WI_ENABLE_EVENTS;
    459             }
    460             else
    461             {
    462                 /* Disable Events*/
    463                 param = FALSE ;
    464             }
    465             p_pipe_info->reg_index = NXP_SE_EVENTS_INDEX;
    466             p_pipe_info->param_info =(void*)&param ;
    467             p_pipe_info->param_length = sizeof(param) ;
    468 
    469             status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
    470             p_wi_info->pipe_id,(uint8_t)ANY_SET_PARAMETER);
    471         }
    472     }
    473     return status;
    474 }
    475 
    476 
    477 /*!
    478 * \brief Sends WI gate specfic HCI Events to the connected reader device.
    479 * This function Sends the WI mode specific HCI Event frames in the HCP packet format to the
    480 * connected reader device.
    481 */
    482 
    483 static
    484 NFCSTATUS
    485 phHciNfc_Send_WI_Event(
    486                        phHciNfc_sContext_t      *psHciContext,
    487                        void                     *pHwRef,
    488                        uint8_t                  pipe_id,
    489                        uint8_t                  event
    490                        )
    491 {
    492     phHciNfc_HCP_Packet_t   *hcp_packet = NULL;
    493     phHciNfc_HCP_Message_t  *hcp_message = NULL;
    494     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;
    495     uint8_t                 length = 0;
    496     uint8_t                 i=0;
    497     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    498 
    499     if( (NULL == psHciContext)
    500         || ( pipe_id > PHHCINFC_MAX_PIPE)
    501         ||(NULL == psHciContext->p_pipe_list[pipe_id])
    502         )
    503     {
    504         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    505         HCI_DEBUG("%s: Invalid Arguments passed \n",
    506             "phHciNfc_Send_WI_Event");
    507     }
    508     else
    509     {
    510         p_pipe_info = (phHciNfc_Pipe_Info_t *)
    511             psHciContext->p_pipe_list[pipe_id];
    512         psHciContext->tx_total = 0 ;
    513         length =length+HCP_HEADER_LEN ;
    514 
    515         if( NXP_EVT_SE_SWITCH_MODE == event)
    516         {
    517             hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
    518             /* Construct the HCP Frame */
    519             phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
    520                                     (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event);
    521             hcp_message = &(hcp_packet->msg.message);
    522             phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
    523                                             i, (uint8_t *)p_pipe_info->param_info,
    524                                             p_pipe_info->param_length);
    525             length =(uint8_t)(length + i + p_pipe_info->param_length);
    526         }
    527         else
    528         {
    529             status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INSTRUCTION );
    530             HCI_DEBUG("%s: Invalid Send Event Request \n","phHciNfc_Send_WI_Event");
    531         }
    532 
    533         if( NFCSTATUS_SUCCESS == status )
    534         {
    535             p_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT ;
    536             p_pipe_info->prev_msg = event ;
    537             psHciContext->tx_total = length;
    538 
    539             /* Send the Constructed HCP packet to the lower layer */
    540             status = phHciNfc_Send_HCP( psHciContext, pHwRef );
    541             p_pipe_info->prev_status = NFCSTATUS_PENDING;
    542         }
    543     }
    544     return status;
    545 }
    546 
    547 static
    548 NFCSTATUS
    549 phHciNfc_Recv_WI_Response(
    550                           void                *psContext,
    551                           void                *pHwRef,
    552                           uint8_t             *pResponse,
    553 #ifdef ONE_BYTE_LEN
    554                           uint8_t             length
    555 #else
    556                           uint16_t            length
    557 #endif
    558                           )
    559 {
    560     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    561     phHciNfc_sContext_t         *psHciContext =
    562                                 (phHciNfc_sContext_t *)psContext;
    563 
    564 
    565     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
    566         || (length == 0))
    567     {
    568         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    569     }
    570     else if(NULL == psHciContext->p_wi_info)
    571     {
    572         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    573     }
    574     else
    575     {
    576         phHciNfc_WI_Info_t     *p_wiinfo=NULL;
    577         uint8_t                 prev_cmd = ANY_GET_PARAMETER;
    578         p_wiinfo = (phHciNfc_WI_Info_t *)psHciContext->p_wi_info ;
    579 
    580         if( NULL == p_wiinfo->p_pipe_info)
    581         {
    582             status = PHNFCSTVAL(CID_NFC_HCI,
    583                 NFCSTATUS_INVALID_HCI_INFORMATION);
    584         }
    585         else
    586         {
    587             prev_cmd = p_wiinfo->p_pipe_info->prev_msg ;
    588             switch(prev_cmd)
    589             {
    590                 case ANY_GET_PARAMETER:
    591                 {
    592                     if (length > HCP_HEADER_LEN)
    593                     {
    594                         status = phHciNfc_WI_InfoUpdate (psHciContext,
    595                                         p_wiinfo->p_pipe_info->reg_index,
    596                                         &pResponse[HCP_HEADER_LEN],
    597                                         (uint8_t)(length - HCP_HEADER_LEN));
    598                     }
    599                     else
    600                     {
    601                         status = PHNFCSTVAL(CID_NFC_HCI,
    602                                             NFCSTATUS_INVALID_HCI_RESPONSE);
    603                     }
    604                     break;
    605                 }
    606                 case ANY_SET_PARAMETER:
    607                 {
    608                     HCI_PRINT("WI Parameter Set \n");
    609                     status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
    610                                                         UPDATE_SEQ);
    611                     break;
    612                 }
    613                 case ANY_OPEN_PIPE:
    614                 {
    615                     HCI_PRINT("WI gate open pipe complete\n");
    616                     status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
    617                                                         UPDATE_SEQ);
    618                     break;
    619                 }
    620                 case ANY_CLOSE_PIPE:
    621                 {
    622                     HCI_PRINT("WI close pipe complete\n");
    623                     status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
    624                                                         UPDATE_SEQ);
    625                     break;
    626                 }
    627                 default:
    628                 {
    629                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
    630                     break;
    631                 }
    632             }
    633             if( NFCSTATUS_SUCCESS == status )
    634             {
    635                 p_wiinfo->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;
    636                 p_wiinfo->current_seq = p_wiinfo->next_seq;
    637             }
    638         }
    639     }
    640     return status;
    641 }
    642 
    643 static
    644 NFCSTATUS
    645 phHciNfc_Recv_WI_Event(
    646                        void               *psContext,
    647                        void               *pHwRef,
    648                        uint8_t            *pEvent,
    649 #ifdef ONE_BYTE_LEN
    650                        uint8_t             length
    651 #else
    652                        uint16_t            length
    653 #endif
    654                        )
    655 {
    656     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    657     phHal_sEventInfo_t          EventInfo;
    658     /* phNfc_sNotificationInfo_t   NotificationInfo; */
    659     phHciNfc_sContext_t         *psHciContext =(phHciNfc_sContext_t *)psContext;
    660 
    661 
    662     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
    663         || (length == 0))
    664     {
    665         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    666     }
    667     else if(NULL == psHciContext->p_wi_info)
    668     {
    669         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
    670     }
    671     else
    672     {
    673         phHciNfc_HCP_Packet_t       *p_packet = NULL;
    674         phHciNfc_HCP_Message_t      *message = NULL;
    675         phHciNfc_WI_Info_t          *p_wi_info = NULL;
    676         uint8_t                     EventType = 0;
    677 
    678         p_wi_info = (phHciNfc_WI_Info_t *)psHciContext->p_wi_info ;
    679 
    680         p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
    681         message = &(p_packet->msg.message);
    682         /* Get the instruction bits from the Message Header */
    683         EventType = (uint8_t) GET_BITS8( message->msg_header,
    684             HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
    685 
    686         EventInfo.eventHost = phHal_eHostController;
    687         EventInfo.eventSource = phHal_ePICC_DevType;
    688         /* Now check for possible Transaction events for reporting */
    689         switch(EventType)
    690         {
    691             case NXP_EVT_SE_START_OF_TRANSACTION:
    692             {
    693                 EventInfo.eventType = NFC_EVT_START_OF_TRANSACTION;
    694                 break;
    695             }
    696             case NXP_EVT_SE_END_OF_TRANSACTION:
    697             {
    698                 EventInfo.eventType = NFC_EVT_END_OF_TRANSACTION;
    699                 break;
    700             }
    701             case NXP_EVT_SE_TRANSACTION:
    702             {
    703                 EventInfo.eventType = NFC_EVT_TRANSACTION;
    704                 EventInfo.eventInfo.aid.buffer = (uint8_t *)p_wi_info->aid;
    705                 /* check for AID data is at least 1 byte is their */
    706                 if (length > HCP_HEADER_LEN)
    707                 {
    708                     EventInfo.eventInfo.aid.length = length - HCP_HEADER_LEN;
    709                     memcpy((void *)p_wi_info->aid, message->payload,
    710                            EventInfo.eventInfo.aid.length );
    711                 }
    712 
    713                 /* Filter Transaction event */
    714                 if (EventInfo.eventInfo.aid.length == 4)
    715                 {
    716                     EventInfo.eventType = NFC_EVT_APDU_RECEIVED;
    717                 }
    718                 else if (EventInfo.eventInfo.aid.length == 2)
    719                 {
    720                     if (!memcmp(paypass_removal, EventInfo.eventInfo.aid.buffer, EventInfo.eventInfo.aid.length))
    721                     {
    722                         EventInfo.eventType = NFC_EVT_EMV_CARD_REMOVAL;
    723                     }
    724                     else if(mifare_access == EventInfo.eventInfo.aid.buffer[0])
    725                     {
    726                         EventInfo.eventType = NFC_EVT_MIFARE_ACCESS;
    727                     }
    728                 }
    729 
    730                 EventInfo.eventInfo.aid.buffer = (uint8_t *)p_wi_info->aid;
    731                 (void) memcpy((void *)p_wi_info->aid,message->payload,
    732                                 EventInfo.eventInfo.aid.length );
    733                 break;
    734             }
    735             default:
    736             {
    737                 status = PHNFCSTVAL(CID_NFC_HCI,
    738                                 NFCSTATUS_INVALID_HCI_INSTRUCTION);
    739                 break;
    740             }
    741         }
    742         if (NFCSTATUS_SUCCESS == status )
    743         {
    744             phHciNfc_Notify_Event(  psHciContext, pHwRef,
    745             NFC_NOTIFY_EVENT, (void*)&EventInfo);
    746         }
    747     }
    748     return status;
    749 }
    750 
    751 static
    752 NFCSTATUS
    753 phHciNfc_WI_InfoUpdate(
    754                        phHciNfc_sContext_t     *psHciContext,
    755                        uint8_t                 index,
    756                        uint8_t                 *reg_value,
    757                        uint8_t                 reg_length
    758                        )
    759 {
    760     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    761     phHciNfc_WI_Info_t      *p_wiinfo = NULL;
    762 
    763     p_wiinfo = psHciContext->p_wi_info;
    764 
    765     if ((NXP_SE_DEFAULTMODE_INDEX == index) &&
    766         (sizeof(*reg_value) == reg_length))
    767     {
    768         p_wiinfo->default_type = *reg_value;
    769     }
    770     else
    771     {
    772         status = PHNFCSTVAL(CID_NFC_HCI,
    773                             NFCSTATUS_INVALID_HCI_RESPONSE);
    774     }
    775 
    776     return status;
    777 }
    778 
    779