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_RFReaderB.c                                                 *
     22 * \brief HCI Reader B Management Routines.                                    *
     23 *                                                                             *
     24 *                                                                             *
     25 * Project: NFC-FRI-1.1                                                        *
     26 *                                                                             *
     27 * $Date: Mon Aug 17 15:17:07 2009 $                                           *
     28 * $Author: ing04880 $                                                         *
     29 * $Revision: 1.7 $                                                           *
     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 /*
     36 ***************************** Header File Inclusion ****************************
     37 */
     38 #include <phNfcCompId.h>
     39 #include <phHciNfc_Pipe.h>
     40 #include <phHciNfc_RFReader.h>
     41 #include <phOsalNfc.h>
     42 
     43 #if defined (TYPE_B)
     44 #include <phHciNfc_RFReaderB.h>
     45 /*
     46 ****************************** Macro Definitions *******************************
     47 */
     48 
     49 #define RDR_B_SINGLE_TAG_FOUND              0x00U
     50 #define RDR_B_MULTIPLE_TAGS_FOUND           0x03U
     51 /* Commands exposed to the upper layer */
     52 #define NXP_WRA_CONTINUE_ACTIVATION         0x12U
     53 
     54 #define RDR_B_PUPI_INDEX                    0x03U
     55 #define RDR_B_APP_DATA_INDEX                0x04U
     56 #define RDR_B_AFI_INDEX                     0x02U
     57 #define RDR_B_HIGHER_LAYER_RESP_INDEX       0x01U
     58 #define RDR_B_HIGHER_LAYER_DATA_INDEX       0x05U
     59 
     60 
     61 /*
     62 *************************** Structure and Enumeration ***************************
     63 */
     64 
     65 
     66 /*
     67 *************************** Static Function Declaration **************************
     68 */
     69 
     70 static
     71 NFCSTATUS
     72 phHciNfc_Recv_ReaderB_Response(
     73                                void                *psContext,
     74                                void                *pHwRef,
     75                                uint8_t             *pResponse,
     76 #ifdef ONE_BYTE_LEN
     77                                uint8_t             length
     78 #else
     79                                uint16_t            length
     80 #endif
     81                                );
     82 
     83 static
     84 NFCSTATUS
     85 phHciNfc_Recv_ReaderB_Event(
     86                             void               *psContext,
     87                             void               *pHwRef,
     88                             uint8_t            *pEvent,
     89 #ifdef ONE_BYTE_LEN
     90                             uint8_t             length
     91 #else
     92                             uint16_t            length
     93 #endif
     94                             );
     95 
     96 static
     97 NFCSTATUS
     98 phHciNfc_ReaderB_InfoUpdate(
     99                             phHciNfc_sContext_t     *psHciContext,
    100                             uint8_t                 index,
    101                             uint8_t                 *reg_value,
    102                             uint8_t                 reg_length
    103                             );
    104 
    105 static
    106 NFCSTATUS
    107 phHciNfc_Recv_Iso_B_Packet(
    108                            phHciNfc_sContext_t  *psHciContext,
    109                            uint8_t              *pResponse,
    110 #ifdef ONE_BYTE_LEN
    111                            uint8_t             length
    112 #else
    113                            uint16_t            length
    114 #endif
    115                            );
    116 /*
    117 *************************** Function Definitions ***************************
    118 */
    119 
    120 NFCSTATUS
    121 phHciNfc_ReaderB_Get_PipeID(
    122                             phHciNfc_sContext_t        *psHciContext,
    123                             uint8_t                    *ppipe_id
    124                             )
    125 {
    126     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    127 
    128     if( (NULL != psHciContext)
    129         && ( NULL != ppipe_id )
    130         && ( NULL != psHciContext->p_reader_b_info )
    131         )
    132     {
    133         phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;
    134         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
    135                             psHciContext->p_reader_b_info ;
    136         *ppipe_id =  p_rdr_b_info->pipe_id  ;
    137     }
    138     else
    139     {
    140         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    141     }
    142     return status;
    143 }
    144 
    145 NFCSTATUS
    146 phHciNfc_ReaderB_Init_Resources(
    147                                 phHciNfc_sContext_t     *psHciContext
    148                                 )
    149 {
    150     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    151     phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;
    152     if( NULL == psHciContext )
    153     {
    154         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    155     }
    156     else
    157     {
    158         if(
    159             ( NULL == psHciContext->p_reader_b_info ) &&
    160                 (phHciNfc_Allocate_Resource((void **)(&p_rdr_b_info),
    161                 sizeof(phHciNfc_ReaderB_Info_t))== NFCSTATUS_SUCCESS)
    162             )
    163         {
    164             psHciContext->p_reader_b_info = p_rdr_b_info;
    165             p_rdr_b_info->current_seq = RDR_B_INVALID_SEQ;
    166             p_rdr_b_info->next_seq = RDR_B_INVALID_SEQ;
    167             p_rdr_b_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
    168         }
    169         else
    170         {
    171             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
    172         }
    173 
    174     }
    175     return status;
    176 }
    177 
    178 NFCSTATUS
    179 phHciNfc_ReaderB_Update_Info(
    180                              phHciNfc_sContext_t        *psHciContext,
    181                              uint8_t                    infotype,
    182                              void                       *rdr_b_info
    183                              )
    184 {
    185     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    186 
    187     if (NULL == psHciContext)
    188     {
    189         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    190     }
    191     else if(NULL == psHciContext->p_reader_b_info)
    192     {
    193         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    194     }
    195     else
    196     {
    197         phHciNfc_ReaderB_Info_t     *ps_rdr_b_info=NULL;
    198         ps_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
    199                         psHciContext->p_reader_b_info ;
    200 
    201         switch(infotype)
    202         {
    203             case HCI_READER_B_ENABLE:
    204             {
    205                 if(NULL != rdr_b_info)
    206                 {
    207                     ps_rdr_b_info->enable_rdr_b_gate =
    208                                 *((uint8_t *)rdr_b_info);
    209                 }
    210                 break;
    211             }
    212             case HCI_READER_B_INFO_SEQ:
    213             {
    214                 ps_rdr_b_info->current_seq = RDR_B_PUPI;
    215                 ps_rdr_b_info->next_seq = RDR_B_PUPI;
    216                 break;
    217             }
    218             default:
    219             {
    220                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    221                 break;
    222             }
    223         }
    224     }
    225     return status;
    226 }
    227 
    228 
    229 NFCSTATUS
    230 phHciNfc_ReaderB_Update_PipeInfo(
    231                                  phHciNfc_sContext_t     *psHciContext,
    232                                  uint8_t                 pipeID,
    233                                  phHciNfc_Pipe_Info_t    *pPipeInfo
    234                                  )
    235 {
    236     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    237 
    238     if( NULL == psHciContext )
    239     {
    240         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    241     }
    242     else if(NULL == psHciContext->p_reader_b_info)
    243     {
    244         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    245     }
    246     else
    247     {
    248         phHciNfc_ReaderB_Info_t *p_rdr_b_info=NULL;
    249         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
    250                             psHciContext->p_reader_b_info ;
    251         /* Update the pipe_id of the reader B Gate obtained from the HCI Response */
    252         p_rdr_b_info->pipe_id = pipeID;
    253         p_rdr_b_info->p_pipe_info = pPipeInfo;
    254         /* Update the Response Receive routine of the reader B Gate */
    255         pPipeInfo->recv_resp = &phHciNfc_Recv_ReaderB_Response;
    256         /* Update the event Receive routine of the reader B Gate */
    257         pPipeInfo->recv_event = &phHciNfc_Recv_ReaderB_Event;
    258     }
    259 
    260     return status;
    261 }
    262 
    263 NFCSTATUS
    264 phHciNfc_ReaderB_Info_Sequence (
    265                                 void             *psHciHandle,
    266                                 void             *pHwRef
    267                                 )
    268 {
    269     NFCSTATUS               status = NFCSTATUS_SUCCESS;
    270     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
    271     if( (NULL == psHciContext)
    272         || (NULL == pHwRef)
    273         )
    274     {
    275         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    276     }
    277     else if((NULL == psHciContext->p_reader_b_info) ||
    278         (HCI_READER_B_ENABLE !=
    279         ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->
    280         enable_rdr_b_gate))
    281     {
    282         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    283     }
    284     else
    285     {
    286         phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;
    287         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
    288         uint8_t                     pipeid = 0;
    289 
    290         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
    291                             psHciContext->p_reader_b_info ;
    292         p_pipe_info = p_rdr_b_info->p_pipe_info;
    293         if(NULL == p_pipe_info )
    294         {
    295             status = PHNFCSTVAL(CID_NFC_HCI,
    296                 NFCSTATUS_INVALID_HCI_SEQUENCE);
    297         }
    298         else
    299         {
    300             switch(p_rdr_b_info->current_seq)
    301             {
    302                 case RDR_B_PUPI:
    303                 {
    304                     p_pipe_info->reg_index = RDR_B_PUPI_INDEX;
    305                     pipeid = p_rdr_b_info->pipe_id ;
    306                     /* Fill the data buffer and send the command to the
    307                     device */
    308                     status =
    309                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
    310                         pipeid, (uint8_t)ANY_GET_PARAMETER);
    311                     if(NFCSTATUS_PENDING == status )
    312                     {
    313                         p_rdr_b_info->next_seq = RDR_B_APP_DATA;
    314                     }
    315                     break;
    316                 }
    317                 case RDR_B_APP_DATA:
    318                 {
    319                     p_pipe_info->reg_index = RDR_B_APP_DATA_INDEX;
    320                     pipeid = p_rdr_b_info->pipe_id ;
    321                     /* Fill the data buffer and send the command to the
    322                     device */
    323                     status =
    324                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
    325                         pipeid, (uint8_t)ANY_GET_PARAMETER);
    326                     if(NFCSTATUS_PENDING == status )
    327                     {
    328                         p_rdr_b_info->next_seq = RDR_B_AFI;
    329                     }
    330                     break;
    331                 }
    332                 case RDR_B_AFI:
    333                 {
    334                     /* RW to the registry */
    335                     p_pipe_info->reg_index = RDR_B_AFI_INDEX;
    336                     pipeid = p_rdr_b_info->pipe_id ;
    337                     /* Fill the data buffer and send the command to the
    338                     device */
    339                     status =
    340                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
    341                         pipeid, (uint8_t)ANY_GET_PARAMETER);
    342                     if(NFCSTATUS_PENDING == status )
    343                     {
    344                         p_rdr_b_info->next_seq = RDR_B_HIGHER_LAYER_RESP;
    345                     }
    346                     break;
    347                 }
    348 
    349                 case RDR_B_HIGHER_LAYER_RESP:
    350                 {
    351                     p_pipe_info->reg_index = RDR_B_HIGHER_LAYER_RESP_INDEX;
    352                     pipeid = p_rdr_b_info->pipe_id ;
    353                     /* Fill the data buffer and send the command to the
    354                         device */
    355                     status =
    356                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
    357                                     pipeid, (uint8_t)ANY_GET_PARAMETER);
    358                     if(NFCSTATUS_PENDING == status )
    359                     {
    360                         p_rdr_b_info->next_seq = RDR_B_HIGHER_LAYER_DATA;
    361                     }
    362                     break;
    363                 }
    364 
    365                 case RDR_B_HIGHER_LAYER_DATA:
    366                 {
    367                     /* RW to the registry */
    368                     p_pipe_info->reg_index = RDR_B_HIGHER_LAYER_DATA_INDEX;
    369                     pipeid = p_rdr_b_info->pipe_id ;
    370                     /* Fill the data buffer and send the command to the
    371                     device */
    372                     status =
    373                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
    374                         pipeid, (uint8_t)ANY_GET_PARAMETER);
    375                     if(NFCSTATUS_PENDING == status )
    376                     {
    377                         p_rdr_b_info->next_seq = RDR_B_END_SEQUENCE;
    378                     }
    379                     break;
    380                 }
    381                 case RDR_B_END_SEQUENCE:
    382                 {
    383                     phNfc_sCompletionInfo_t     CompInfo;
    384                     if (RDR_B_MULTIPLE_TAGS_FOUND ==
    385                         p_rdr_b_info->multiple_tgts_found)
    386                     {
    387                         CompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
    388                     }
    389                     else
    390                     {
    391                         CompInfo.status = NFCSTATUS_SUCCESS;
    392                     }
    393 
    394                     CompInfo.info = &(p_rdr_b_info->reader_b_info);
    395 
    396                     p_rdr_b_info->reader_b_info.RemDevType = phHal_eISO14443_B_PICC;
    397                     p_rdr_b_info->current_seq = RDR_B_PUPI;
    398                     p_rdr_b_info->next_seq = RDR_B_PUPI;
    399                     status = NFCSTATUS_SUCCESS;
    400                     /* Notify to the upper layer */
    401                     phHciNfc_Tag_Notify(psHciContext,
    402                                         pHwRef,
    403                                         NFC_NOTIFY_TARGET_DISCOVERED,
    404                                         &CompInfo);
    405                     break;
    406                 }
    407                 default:
    408                 {
    409                     status = PHNFCSTVAL(CID_NFC_HCI,
    410                         NFCSTATUS_INVALID_HCI_RESPONSE);
    411                     break;
    412                 }
    413             }
    414         }
    415     }
    416     return status;
    417 }
    418 
    419 static
    420 NFCSTATUS
    421 phHciNfc_Recv_ReaderB_Response(
    422                                void                *psContext,
    423                                void                *pHwRef,
    424                                uint8_t             *pResponse,
    425 #ifdef ONE_BYTE_LEN
    426                                uint8_t              length
    427 #else
    428                                uint16_t             length
    429 #endif
    430                                )
    431 {
    432     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    433     phHciNfc_sContext_t         *psHciContext =
    434                                 (phHciNfc_sContext_t *)psContext ;
    435 
    436     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
    437         || (length == 0))
    438     {
    439         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    440     }
    441     else if(NULL == psHciContext->p_reader_b_info)
    442     {
    443         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    444     }
    445     else
    446     {
    447         phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;
    448         uint8_t                     prev_cmd = ANY_GET_PARAMETER;
    449 
    450         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
    451                                 psHciContext->p_reader_b_info ;
    452         if( NULL == p_rdr_b_info->p_pipe_info)
    453         {
    454             status = PHNFCSTVAL(CID_NFC_HCI,
    455                                 NFCSTATUS_INVALID_HCI_SEQUENCE);
    456         }
    457         else
    458         {
    459             prev_cmd = p_rdr_b_info->p_pipe_info->prev_msg ;
    460             switch(prev_cmd)
    461             {
    462             case ANY_GET_PARAMETER:
    463                 {
    464                     status = phHciNfc_ReaderB_InfoUpdate(psHciContext,
    465                                         p_rdr_b_info->p_pipe_info->reg_index,
    466                                         &pResponse[HCP_HEADER_LEN],
    467                                         (uint8_t)(length - HCP_HEADER_LEN));
    468                     break;
    469                 }
    470                 case ANY_SET_PARAMETER:
    471                 {
    472                     HCI_PRINT("Reader B Parameter Set \n");
    473                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
    474                                                                 UPDATE_SEQ);
    475                     p_rdr_b_info->next_seq = RDR_B_PUPI;
    476                     break;
    477                 }
    478                 case ANY_OPEN_PIPE:
    479                 {
    480                     HCI_PRINT("Reader B open pipe complete\n");
    481                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
    482                                                                 UPDATE_SEQ);
    483                     p_rdr_b_info->next_seq = RDR_B_PUPI;
    484                     break;
    485                 }
    486                 case ANY_CLOSE_PIPE:
    487                 {
    488                     HCI_PRINT("Reader B close pipe complete\n");
    489                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
    490                                                                 UPDATE_SEQ);
    491                     break;
    492                 }
    493                 case NXP_WRA_CONTINUE_ACTIVATION:
    494                 case NXP_WR_ACTIVATE_ID:
    495                 {
    496                     HCI_PRINT("Reader B continue activation or ");
    497                     HCI_PRINT("reactivation completed \n");
    498                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
    499                                                     UPDATE_SEQ);
    500                     break;
    501                 }
    502                 case WR_XCHGDATA:
    503                 {
    504                     if (length >= HCP_HEADER_LEN)
    505                     {
    506                         uint8_t         i = 1;
    507                         HCI_PRINT("ISO 14443-4B received \n");
    508                         /* Copy buffer to the receive buffer */
    509                         phHciNfc_Append_HCPFrame(psHciContext->recv_buffer,
    510                                                 0, pResponse, length);
    511                         psHciContext->rx_total = (length - i);
    512                         status = phHciNfc_Recv_Iso_B_Packet(psHciContext,
    513                                                     &pResponse[HCP_HEADER_LEN],
    514                                                     (length - HCP_HEADER_LEN));
    515                     }
    516                     else
    517                     {
    518                         status = PHNFCSTVAL(CID_NFC_HCI,
    519                                             NFCSTATUS_INVALID_HCI_RESPONSE);
    520                     }
    521                     break;
    522                 }
    523                 case NXP_WR_PRESCHECK:
    524                 {
    525                     HCI_PRINT("Presence check completed \n");
    526                     break;
    527                 }
    528                 case NXP_WR_ACTIVATE_NEXT:
    529                 {
    530                     if (length > HCP_HEADER_LEN)
    531                     {
    532                         if (RDR_B_MULTIPLE_TAGS_FOUND == pResponse[HCP_HEADER_LEN])
    533                         {
    534                             p_rdr_b_info->multiple_tgts_found =
    535                                 RDR_B_MULTIPLE_TAGS_FOUND;
    536                         }
    537                         else
    538                         {
    539                             p_rdr_b_info->multiple_tgts_found = FALSE;
    540                         }
    541                         HCI_PRINT("Activate next completed \n");
    542                     }
    543                     else
    544                     {
    545                         status = PHNFCSTVAL(CID_NFC_HCI,
    546                                             NFCSTATUS_INVALID_HCI_RESPONSE);
    547                     }
    548                     break;
    549                 }
    550                 case NXP_WR_DISPATCH_TO_UICC:
    551                 {
    552                     switch(length)
    553                     {
    554                         case HCP_HEADER_LEN:
    555                         {
    556                             /* Error code field is optional, if no error
    557                                 code field in the response, then the command
    558                                 is successfully completed */
    559                             p_rdr_b_info->uicc_activation =
    560                                         UICC_CARD_ACTIVATION_SUCCESS;
    561                             break;
    562                         }
    563                         case (HCP_HEADER_LEN + 1):
    564                         {
    565                             p_rdr_b_info->uicc_activation =
    566                                         pResponse[HCP_HEADER_LEN];
    567                             break;
    568                         } /* End of case (HCP_HEADER_LEN + index) */
    569                         default:
    570                         {
    571                             status = PHNFCSTVAL(CID_NFC_HCI,
    572                                                 NFCSTATUS_INVALID_HCI_RESPONSE);
    573                             break;
    574                         }
    575                     } /* End of switch(length) */
    576                     if (NFCSTATUS_SUCCESS == status)
    577                     {
    578                         status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
    579                                                                     UPDATE_SEQ);
    580                     }
    581                     break;
    582                 }
    583                 default:
    584                 {
    585                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
    586                     break;
    587                 }
    588             }
    589             if( NFCSTATUS_SUCCESS == status )
    590             {
    591                 p_rdr_b_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;
    592                 p_rdr_b_info->current_seq = p_rdr_b_info->next_seq;
    593             }
    594         }
    595     }
    596     return status;
    597 }
    598 
    599 
    600 static
    601 NFCSTATUS
    602 phHciNfc_Recv_ReaderB_Event(
    603                             void               *psContext,
    604                             void               *pHwRef,
    605                             uint8_t            *pEvent,
    606 #ifdef ONE_BYTE_LEN
    607                             uint8_t             length
    608 #else
    609                             uint16_t            length
    610 #endif
    611                             )
    612 {
    613     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    614     phHciNfc_sContext_t         *psHciContext =
    615                                 (phHciNfc_sContext_t *)psContext ;
    616     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
    617         || (length == 0))
    618     {
    619         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    620     }
    621     else if((NULL == psHciContext->p_reader_b_info) ||
    622         (HCI_READER_B_ENABLE !=
    623         ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->
    624         enable_rdr_b_gate))
    625     {
    626         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    627     }
    628     else
    629     {
    630         phHciNfc_HCP_Packet_t       *p_packet = NULL;
    631         phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;
    632         phHciNfc_HCP_Message_t      *message = NULL;
    633         uint8_t                     instruction=0,
    634                                     i = 0;
    635 
    636         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
    637                                     psHciContext->p_reader_b_info ;
    638         p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
    639         message = &p_packet->msg.message;
    640         /* Get the instruction bits from the Message Header */
    641         instruction = (uint8_t) GET_BITS8( message->msg_header,
    642                         HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
    643 
    644         if ((EVT_TARGET_DISCOVERED == instruction)
    645             && ((RDR_B_MULTIPLE_TAGS_FOUND == message->payload[i] )
    646             || (RDR_B_SINGLE_TAG_FOUND == message->payload[i]))
    647             )
    648         {
    649             phNfc_sCompletionInfo_t pCompInfo;
    650 
    651             if (RDR_B_MULTIPLE_TAGS_FOUND == message->payload[i])
    652             {
    653                 p_rdr_b_info->multiple_tgts_found = RDR_B_MULTIPLE_TAGS_FOUND;
    654                 pCompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
    655             }
    656             else
    657             {
    658                 p_rdr_b_info->multiple_tgts_found = FALSE;
    659                 pCompInfo.status = NFCSTATUS_SUCCESS;
    660             }
    661 
    662             psHciContext->host_rf_type = phHal_eISO14443_B_PCD;
    663             p_rdr_b_info->reader_b_info.RemDevType = phHal_eISO14443_B_PICC;
    664             p_rdr_b_info->current_seq = RDR_B_PUPI;
    665 
    666             /* Notify to the HCI Generic layer To Update the FSM */
    667             phHciNfc_Notify_Event(psHciContext, pHwRef,
    668                                     NFC_NOTIFY_TARGET_DISCOVERED,
    669                                     &pCompInfo);
    670 
    671         }
    672         else
    673         {
    674             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
    675         }
    676     }
    677     return status;
    678 }
    679 
    680 static
    681 NFCSTATUS
    682 phHciNfc_ReaderB_InfoUpdate(
    683                             phHciNfc_sContext_t     *psHciContext,
    684                             uint8_t                 index,
    685                             uint8_t                 *reg_value,
    686                             uint8_t                 reg_length
    687                             )
    688 {
    689     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    690     phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;
    691     phHal_sIso14443BInfo_t      *p_tag_b_info = NULL;
    692 
    693     p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
    694                     (psHciContext->p_reader_b_info );
    695     p_tag_b_info = &(p_rdr_b_info->reader_b_info.RemoteDevInfo.Iso14443B_Info);
    696 
    697     switch(index)
    698     {
    699         case RDR_B_PUPI_INDEX:
    700         {
    701             HCI_PRINT_BUFFER("\tReader B PUPI", reg_value, reg_length);
    702             /* Update PUPI buffer and length in the remote device info,
    703                 PUPI length is 4 bytes */
    704             if(PHHAL_PUPI_LENGTH == reg_length)
    705             {
    706                 (void)memcpy((void *)p_tag_b_info->AtqB.AtqResInfo.Pupi,
    707                             (void *)reg_value, reg_length);
    708             }
    709             else
    710             {
    711                 status = PHNFCSTVAL(CID_NFC_HCI,
    712                                     NFCSTATUS_INVALID_HCI_RESPONSE);
    713             }
    714             break;
    715         }
    716         case RDR_B_APP_DATA_INDEX:
    717         {
    718             HCI_PRINT_BUFFER("\tReader B Application data", reg_value, reg_length);
    719             /* Update application data buffer and length, 3 bytes,
    720                 this includes CRC_B and number of application
    721              */
    722             if(PHHAL_APP_DATA_B_LENGTH == reg_length)
    723             {
    724                 (void)memcpy((void *)p_tag_b_info->AtqB.AtqResInfo.AppData,
    725                             (void *)reg_value, reg_length);
    726             }
    727             else
    728             {
    729                 status = PHNFCSTVAL(CID_NFC_HCI,
    730                                     NFCSTATUS_INVALID_HCI_RESPONSE);
    731             }
    732             break;
    733         }
    734         case RDR_B_AFI_INDEX:
    735         {
    736             HCI_PRINT_BUFFER("\tReader B AFI", reg_value, reg_length);
    737             /* Update AFI byte, Only one byte */
    738             if(sizeof(*reg_value) == reg_length)
    739             {
    740                 p_tag_b_info->Afi = *reg_value;
    741             }
    742             else
    743             {
    744                 status = PHNFCSTVAL(CID_NFC_HCI,
    745                                     NFCSTATUS_INVALID_HCI_RESPONSE);
    746             }
    747             break;
    748         }
    749 
    750         case RDR_B_HIGHER_LAYER_RESP_INDEX:
    751         {
    752             HCI_PRINT_BUFFER("\tReader B higher layer response", reg_value, reg_length);
    753             /* Update higher layer response buffer and length */
    754             if (reg_length <= PHHAL_MAX_ATR_LENGTH)
    755             {
    756                 (void)memcpy((void *)p_tag_b_info->HiLayerResp,
    757                                 (void *)reg_value, reg_length);
    758             }
    759             else
    760             {
    761                 status = PHNFCSTVAL(CID_NFC_HCI,
    762                                     NFCSTATUS_INVALID_HCI_RESPONSE);
    763             }
    764             break;
    765         }
    766 
    767         case RDR_B_HIGHER_LAYER_DATA_INDEX:
    768         {
    769             HCI_PRINT_BUFFER("\tReader B higher layer data", reg_value, reg_length);
    770             /* Update higher layer data buffer and length */
    771             break;
    772         }
    773         default:
    774         {
    775             status = PHNFCSTVAL(CID_NFC_HCI,
    776                                 NFCSTATUS_INVALID_HCI_RESPONSE);
    777             break;
    778         }
    779     }
    780     return status;
    781 }
    782 
    783 
    784 static
    785 NFCSTATUS
    786 phHciNfc_Recv_Iso_B_Packet(
    787                            phHciNfc_sContext_t  *psHciContext,
    788                            uint8_t              *pResponse,
    789 #ifdef ONE_BYTE_LEN
    790                            uint8_t             length
    791 #else
    792                            uint16_t            length
    793 #endif
    794                            )
    795 {
    796     NFCSTATUS       status = NFCSTATUS_SUCCESS;
    797     uint8_t         i = 1;
    798 
    799     psHciContext->rx_index = HCP_HEADER_LEN;
    800     /* command WR_XCHG_DATA: so give ISO 14443-4B data to the upper layer */
    801     HCI_PRINT_BUFFER("ISO 14443-4B Bytes received", pResponse, length);
    802     if(FALSE != pResponse[(length - i)])
    803     {
    804         status = PHNFCSTVAL(CID_NFC_HCI,
    805                             NFCSTATUS_RF_ERROR);
    806     }
    807     return status;
    808 }
    809 
    810 
    811 NFCSTATUS
    812 phHciNfc_ReaderB_Set_AFI(
    813                         void         *psContext,
    814                         void         *pHwRef,
    815                         uint8_t      afi_value
    816                         )
    817 {
    818     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    819     phHciNfc_sContext_t         *psHciContext =
    820                                 (phHciNfc_sContext_t *)psContext ;
    821     if( (NULL == psHciContext) || (NULL == pHwRef))
    822     {
    823         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    824     }
    825     else if((NULL == psHciContext->p_reader_b_info) ||
    826         (HCI_READER_B_ENABLE !=
    827         ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->
    828         enable_rdr_b_gate))
    829     {
    830         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    831     }
    832     else
    833     {
    834         phHciNfc_ReaderB_Info_t     *ps_rdr_b_info=NULL;
    835         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
    836         uint8_t                     pipeid = 0;
    837 
    838         ps_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
    839                         psHciContext->p_reader_b_info ;
    840         p_pipe_info = ps_rdr_b_info->p_pipe_info;
    841         if(NULL == p_pipe_info )
    842         {
    843             status = PHNFCSTVAL(CID_NFC_HCI,
    844                 NFCSTATUS_INVALID_HCI_SEQUENCE);
    845         }
    846         else
    847         {
    848             pipeid = ps_rdr_b_info->pipe_id ;
    849             p_pipe_info->reg_index = RDR_B_AFI_INDEX;
    850 
    851             p_pipe_info->param_info = &afi_value;
    852             p_pipe_info->param_length = sizeof(uint8_t);
    853             /* Fill the data buffer and send the command to the
    854             device */
    855             status =
    856                 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
    857                                 pipeid, (uint8_t)ANY_SET_PARAMETER);
    858         }
    859     }
    860     return status;
    861 }
    862 
    863 NFCSTATUS
    864 phHciNfc_ReaderB_Set_LayerData(
    865                         void            *psContext,
    866                         void            *pHwRef,
    867                         phNfc_sData_t   *layer_data_info
    868                         )
    869 {
    870     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    871     phHciNfc_sContext_t         *psHciContext =
    872                                 (phHciNfc_sContext_t *)psContext ;
    873 
    874     if( (NULL == psHciContext) || (NULL == pHwRef) ||
    875         (NULL == layer_data_info) || (NULL == layer_data_info->buffer)
    876         || (0 == layer_data_info->length))
    877     {
    878         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    879     }
    880     else if((NULL == psHciContext->p_reader_b_info) ||
    881         (HCI_READER_B_ENABLE !=
    882         ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->
    883         enable_rdr_b_gate))
    884     {
    885         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
    886     }
    887     else
    888     {
    889         phHciNfc_ReaderB_Info_t     *ps_rdr_b_info=NULL;
    890         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
    891         uint8_t                     pipeid = 0;
    892 
    893         ps_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
    894                         psHciContext->p_reader_b_info ;
    895         p_pipe_info = ps_rdr_b_info->p_pipe_info;
    896         if(NULL == p_pipe_info )
    897         {
    898             status = PHNFCSTVAL(CID_NFC_HCI,
    899                 NFCSTATUS_INVALID_HCI_SEQUENCE);
    900         }
    901         else
    902         {
    903             p_pipe_info->reg_index = RDR_B_HIGHER_LAYER_DATA_INDEX;
    904             pipeid = ps_rdr_b_info->pipe_id ;
    905             p_pipe_info->param_info = (void *)layer_data_info->buffer;
    906             p_pipe_info->param_length = (uint8_t)
    907                                         layer_data_info->length;
    908             /* Fill the data buffer and send the command to the
    909             device */
    910             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
    911                                 pipeid, (uint8_t)ANY_SET_PARAMETER);
    912         }
    913     }
    914     return status;
    915 }
    916 #endif /* #if defined (TYPE_B) */
    917 
    918 
    919