2 * Copyright (C) 2010 NXP Semiconductors
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
18 * =========================================================================== *
\r
21 * \file phHciNfc_RFReaderB.c *
\r
22 * \brief HCI Reader B Management Routines. *
\r
25 * Project: NFC-FRI-1.1 *
\r
27 * $Date: Mon Aug 17 15:17:07 2009 $ *
\r
28 * $Author: ing04880 $ *
\r
29 * $Revision: 1.7 $ *
\r
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 $
\r
32 * =========================================================================== *
\r
36 ***************************** Header File Inclusion ****************************
\r
38 #include <phNfcCompId.h>
\r
39 #include <phHciNfc_Pipe.h>
\r
40 #include <phHciNfc_RFReader.h>
\r
41 #include <phOsalNfc.h>
\r
43 #if defined (TYPE_B)
\r
44 #include <phHciNfc_RFReaderB.h>
\r
46 ****************************** Macro Definitions *******************************
\r
49 #define RDR_B_SINGLE_TAG_FOUND 0x00U
\r
50 #define RDR_B_MULTIPLE_TAGS_FOUND 0x03U
\r
51 /* Commands exposed to the upper layer */
\r
52 #define NXP_WRA_CONTINUE_ACTIVATION 0x12U
\r
54 #define RDR_B_PUPI_INDEX 0x03U
\r
55 #define RDR_B_APP_DATA_INDEX 0x04U
\r
56 #define RDR_B_AFI_INDEX 0x02U
\r
57 #define RDR_B_HIGHER_LAYER_RESP_INDEX 0x01U
\r
58 #define RDR_B_HIGHER_LAYER_DATA_INDEX 0x05U
\r
62 *************************** Structure and Enumeration ***************************
\r
67 *************************** Static Function Declaration **************************
\r
72 phHciNfc_Recv_ReaderB_Response(
\r
85 phHciNfc_Recv_ReaderB_Event(
\r
98 phHciNfc_ReaderB_InfoUpdate(
\r
99 phHciNfc_sContext_t *psHciContext,
\r
101 uint8_t *reg_value,
\r
107 phHciNfc_Recv_Iso_B_Packet(
\r
108 phHciNfc_sContext_t *psHciContext,
\r
109 uint8_t *pResponse,
\r
110 #ifdef ONE_BYTE_LEN
\r
117 *************************** Function Definitions ***************************
\r
121 phHciNfc_ReaderB_Get_PipeID(
\r
122 phHciNfc_sContext_t *psHciContext,
\r
126 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
128 if( (NULL != psHciContext)
\r
129 && ( NULL != ppipe_id )
\r
130 && ( NULL != psHciContext->p_reader_b_info )
\r
133 phHciNfc_ReaderB_Info_t *p_rdr_b_info=NULL;
\r
134 p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
\r
135 psHciContext->p_reader_b_info ;
\r
136 *ppipe_id = p_rdr_b_info->pipe_id ;
\r
140 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
146 phHciNfc_ReaderB_Init_Resources(
\r
147 phHciNfc_sContext_t *psHciContext
\r
150 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
151 phHciNfc_ReaderB_Info_t *p_rdr_b_info=NULL;
\r
152 if( NULL == psHciContext )
\r
154 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
159 ( NULL == psHciContext->p_reader_b_info ) &&
\r
160 (phHciNfc_Allocate_Resource((void **)(&p_rdr_b_info),
\r
161 sizeof(phHciNfc_ReaderB_Info_t))== NFCSTATUS_SUCCESS)
\r
164 psHciContext->p_reader_b_info = p_rdr_b_info;
\r
165 p_rdr_b_info->current_seq = RDR_B_INVALID_SEQ;
\r
166 p_rdr_b_info->next_seq = RDR_B_INVALID_SEQ;
\r
167 p_rdr_b_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
\r
171 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
\r
179 phHciNfc_ReaderB_Update_Info(
\r
180 phHciNfc_sContext_t *psHciContext,
\r
185 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
187 if (NULL == psHciContext)
\r
189 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
191 else if(NULL == psHciContext->p_reader_b_info)
\r
193 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
\r
197 phHciNfc_ReaderB_Info_t *ps_rdr_b_info=NULL;
\r
198 ps_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
\r
199 psHciContext->p_reader_b_info ;
\r
203 case HCI_READER_B_ENABLE:
\r
205 if(NULL != rdr_b_info)
\r
207 ps_rdr_b_info->enable_rdr_b_gate =
\r
208 *((uint8_t *)rdr_b_info);
\r
212 case HCI_READER_B_INFO_SEQ:
\r
214 ps_rdr_b_info->current_seq = RDR_B_PUPI;
\r
215 ps_rdr_b_info->next_seq = RDR_B_PUPI;
\r
220 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
230 phHciNfc_ReaderB_Update_PipeInfo(
\r
231 phHciNfc_sContext_t *psHciContext,
\r
233 phHciNfc_Pipe_Info_t *pPipeInfo
\r
236 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
238 if( NULL == psHciContext )
\r
240 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
242 else if(NULL == psHciContext->p_reader_b_info)
\r
244 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
\r
248 phHciNfc_ReaderB_Info_t *p_rdr_b_info=NULL;
\r
249 p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
\r
250 psHciContext->p_reader_b_info ;
\r
251 /* Update the pipe_id of the reader B Gate obtained from the HCI Response */
\r
252 p_rdr_b_info->pipe_id = pipeID;
\r
253 p_rdr_b_info->p_pipe_info = pPipeInfo;
\r
254 /* Update the Response Receive routine of the reader B Gate */
\r
255 pPipeInfo->recv_resp = &phHciNfc_Recv_ReaderB_Response;
\r
256 /* Update the event Receive routine of the reader B Gate */
\r
257 pPipeInfo->recv_event = &phHciNfc_Recv_ReaderB_Event;
\r
264 phHciNfc_ReaderB_Info_Sequence (
\r
269 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
270 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
\r
271 if( (NULL == psHciContext)
\r
272 || (NULL == pHwRef)
\r
275 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
277 else if((NULL == psHciContext->p_reader_b_info) ||
\r
278 (HCI_READER_B_ENABLE !=
\r
279 ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->
\r
280 enable_rdr_b_gate))
\r
282 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
\r
286 phHciNfc_ReaderB_Info_t *p_rdr_b_info=NULL;
\r
287 phHciNfc_Pipe_Info_t *p_pipe_info=NULL;
\r
288 uint8_t pipeid = 0;
\r
290 p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
\r
291 psHciContext->p_reader_b_info ;
\r
292 p_pipe_info = p_rdr_b_info->p_pipe_info;
\r
293 if(NULL == p_pipe_info )
\r
295 status = PHNFCSTVAL(CID_NFC_HCI,
\r
296 NFCSTATUS_INVALID_HCI_SEQUENCE);
\r
300 switch(p_rdr_b_info->current_seq)
\r
304 p_pipe_info->reg_index = RDR_B_PUPI_INDEX;
\r
305 pipeid = p_rdr_b_info->pipe_id ;
\r
306 /* Fill the data buffer and send the command to the
\r
309 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
\r
310 pipeid, (uint8_t)ANY_GET_PARAMETER);
\r
311 if(NFCSTATUS_PENDING == status )
\r
313 p_rdr_b_info->next_seq = RDR_B_APP_DATA;
\r
317 case RDR_B_APP_DATA:
\r
319 p_pipe_info->reg_index = RDR_B_APP_DATA_INDEX;
\r
320 pipeid = p_rdr_b_info->pipe_id ;
\r
321 /* Fill the data buffer and send the command to the
\r
324 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
\r
325 pipeid, (uint8_t)ANY_GET_PARAMETER);
\r
326 if(NFCSTATUS_PENDING == status )
\r
328 p_rdr_b_info->next_seq = RDR_B_AFI;
\r
334 /* RW to the registry */
\r
335 p_pipe_info->reg_index = RDR_B_AFI_INDEX;
\r
336 pipeid = p_rdr_b_info->pipe_id ;
\r
337 /* Fill the data buffer and send the command to the
\r
340 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
\r
341 pipeid, (uint8_t)ANY_GET_PARAMETER);
\r
342 if(NFCSTATUS_PENDING == status )
\r
344 p_rdr_b_info->next_seq = RDR_B_HIGHER_LAYER_RESP;
\r
349 case RDR_B_HIGHER_LAYER_RESP:
\r
351 p_pipe_info->reg_index = RDR_B_HIGHER_LAYER_RESP_INDEX;
\r
352 pipeid = p_rdr_b_info->pipe_id ;
\r
353 /* Fill the data buffer and send the command to the
\r
356 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
\r
357 pipeid, (uint8_t)ANY_GET_PARAMETER);
\r
358 if(NFCSTATUS_PENDING == status )
\r
360 p_rdr_b_info->next_seq = RDR_B_HIGHER_LAYER_DATA;
\r
365 case RDR_B_HIGHER_LAYER_DATA:
\r
367 /* RW to the registry */
\r
368 p_pipe_info->reg_index = RDR_B_HIGHER_LAYER_DATA_INDEX;
\r
369 pipeid = p_rdr_b_info->pipe_id ;
\r
370 /* Fill the data buffer and send the command to the
\r
373 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
\r
374 pipeid, (uint8_t)ANY_GET_PARAMETER);
\r
375 if(NFCSTATUS_PENDING == status )
\r
377 p_rdr_b_info->next_seq = RDR_B_END_SEQUENCE;
\r
381 case RDR_B_END_SEQUENCE:
\r
383 phNfc_sCompletionInfo_t CompInfo;
\r
384 if (RDR_B_MULTIPLE_TAGS_FOUND ==
\r
385 p_rdr_b_info->multiple_tgts_found)
\r
387 CompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
\r
391 CompInfo.status = NFCSTATUS_SUCCESS;
\r
394 CompInfo.info = &(p_rdr_b_info->reader_b_info);
\r
396 p_rdr_b_info->reader_b_info.RemDevType = phHal_eISO14443_B_PICC;
\r
397 p_rdr_b_info->current_seq = RDR_B_PUPI;
\r
398 p_rdr_b_info->next_seq = RDR_B_PUPI;
\r
399 status = NFCSTATUS_SUCCESS;
\r
400 /* Notify to the upper layer */
\r
401 phHciNfc_Tag_Notify(psHciContext,
\r
403 NFC_NOTIFY_TARGET_DISCOVERED,
\r
409 status = PHNFCSTVAL(CID_NFC_HCI,
\r
410 NFCSTATUS_INVALID_HCI_RESPONSE);
\r
421 phHciNfc_Recv_ReaderB_Response(
\r
424 uint8_t *pResponse,
\r
425 #ifdef ONE_BYTE_LEN
\r
432 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
433 phHciNfc_sContext_t *psHciContext =
\r
434 (phHciNfc_sContext_t *)psContext ;
\r
436 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
\r
439 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
441 else if(NULL == psHciContext->p_reader_b_info)
\r
443 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
\r
447 phHciNfc_ReaderB_Info_t *p_rdr_b_info=NULL;
\r
448 uint8_t prev_cmd = ANY_GET_PARAMETER;
\r
450 p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
\r
451 psHciContext->p_reader_b_info ;
\r
452 if( NULL == p_rdr_b_info->p_pipe_info)
\r
454 status = PHNFCSTVAL(CID_NFC_HCI,
\r
455 NFCSTATUS_INVALID_HCI_SEQUENCE);
\r
459 prev_cmd = p_rdr_b_info->p_pipe_info->prev_msg ;
\r
462 case ANY_GET_PARAMETER:
\r
464 status = phHciNfc_ReaderB_InfoUpdate(psHciContext,
\r
465 p_rdr_b_info->p_pipe_info->reg_index,
\r
466 &pResponse[HCP_HEADER_LEN],
\r
467 (uint8_t)(length - HCP_HEADER_LEN));
\r
470 case ANY_SET_PARAMETER:
\r
472 HCI_PRINT("Reader B Parameter Set \n");
\r
473 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
\r
475 p_rdr_b_info->next_seq = RDR_B_PUPI;
\r
478 case ANY_OPEN_PIPE:
\r
480 HCI_PRINT("Reader B open pipe complete\n");
\r
481 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
\r
483 p_rdr_b_info->next_seq = RDR_B_PUPI;
\r
486 case ANY_CLOSE_PIPE:
\r
488 HCI_PRINT("Reader B close pipe complete\n");
\r
489 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
\r
493 case NXP_WRA_CONTINUE_ACTIVATION:
\r
494 case NXP_WR_ACTIVATE_ID:
\r
496 HCI_PRINT("Reader B continue activation or ");
\r
497 HCI_PRINT("reactivation completed \n");
\r
498 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
\r
504 if (length >= HCP_HEADER_LEN)
\r
507 HCI_PRINT("ISO 14443-4B received \n");
\r
508 /* Copy buffer to the receive buffer */
\r
509 phHciNfc_Append_HCPFrame(psHciContext->recv_buffer,
\r
510 0, pResponse, length);
\r
511 psHciContext->rx_total = (length - i);
\r
512 status = phHciNfc_Recv_Iso_B_Packet(psHciContext,
\r
513 &pResponse[HCP_HEADER_LEN],
\r
514 (length - HCP_HEADER_LEN));
\r
518 status = PHNFCSTVAL(CID_NFC_HCI,
\r
519 NFCSTATUS_INVALID_HCI_RESPONSE);
\r
523 case NXP_WR_PRESCHECK:
\r
525 HCI_PRINT("Presence check completed \n");
\r
528 case NXP_WR_ACTIVATE_NEXT:
\r
530 if (length > HCP_HEADER_LEN)
\r
532 if (RDR_B_MULTIPLE_TAGS_FOUND == pResponse[HCP_HEADER_LEN])
\r
534 p_rdr_b_info->multiple_tgts_found =
\r
535 RDR_B_MULTIPLE_TAGS_FOUND;
\r
539 p_rdr_b_info->multiple_tgts_found = FALSE;
\r
541 HCI_PRINT("Activate next completed \n");
\r
545 status = PHNFCSTVAL(CID_NFC_HCI,
\r
546 NFCSTATUS_INVALID_HCI_RESPONSE);
\r
550 case NXP_WR_DISPATCH_TO_UICC:
\r
554 case HCP_HEADER_LEN:
\r
556 /* Error code field is optional, if no error
\r
557 code field in the response, then the command
\r
558 is successfully completed */
\r
559 p_rdr_b_info->uicc_activation =
\r
560 UICC_CARD_ACTIVATION_SUCCESS;
\r
563 case (HCP_HEADER_LEN + 1):
\r
565 p_rdr_b_info->uicc_activation =
\r
566 pResponse[HCP_HEADER_LEN];
\r
568 } /* End of case (HCP_HEADER_LEN + index) */
\r
571 status = PHNFCSTVAL(CID_NFC_HCI,
\r
572 NFCSTATUS_INVALID_HCI_RESPONSE);
\r
575 } /* End of switch(length) */
\r
576 if (NFCSTATUS_SUCCESS == status)
\r
578 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
\r
585 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
\r
589 if( NFCSTATUS_SUCCESS == status )
\r
591 p_rdr_b_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;
\r
592 p_rdr_b_info->current_seq = p_rdr_b_info->next_seq;
\r
602 phHciNfc_Recv_ReaderB_Event(
\r
606 #ifdef ONE_BYTE_LEN
\r
613 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
614 phHciNfc_sContext_t *psHciContext =
\r
615 (phHciNfc_sContext_t *)psContext ;
\r
616 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
\r
619 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
621 else if((NULL == psHciContext->p_reader_b_info) ||
\r
622 (HCI_READER_B_ENABLE !=
\r
623 ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->
\r
624 enable_rdr_b_gate))
\r
626 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
\r
630 phHciNfc_HCP_Packet_t *p_packet = NULL;
\r
631 phHciNfc_ReaderB_Info_t *p_rdr_b_info=NULL;
\r
632 phHciNfc_HCP_Message_t *message = NULL;
\r
633 uint8_t instruction=0,
\r
636 p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
\r
637 psHciContext->p_reader_b_info ;
\r
638 p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
\r
639 message = &p_packet->msg.message;
\r
640 /* Get the instruction bits from the Message Header */
\r
641 instruction = (uint8_t) GET_BITS8( message->msg_header,
\r
642 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
\r
644 if ((EVT_TARGET_DISCOVERED == instruction)
\r
645 && ((RDR_B_MULTIPLE_TAGS_FOUND == message->payload[i] )
\r
646 || (RDR_B_SINGLE_TAG_FOUND == message->payload[i]))
\r
649 phNfc_sCompletionInfo_t pCompInfo;
\r
651 if (RDR_B_MULTIPLE_TAGS_FOUND == message->payload[i])
\r
653 p_rdr_b_info->multiple_tgts_found = RDR_B_MULTIPLE_TAGS_FOUND;
\r
654 pCompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
\r
658 p_rdr_b_info->multiple_tgts_found = FALSE;
\r
659 pCompInfo.status = NFCSTATUS_SUCCESS;
\r
662 psHciContext->host_rf_type = phHal_eISO14443_B_PCD;
\r
663 p_rdr_b_info->reader_b_info.RemDevType = phHal_eISO14443_B_PICC;
\r
664 p_rdr_b_info->current_seq = RDR_B_PUPI;
\r
666 /* Notify to the HCI Generic layer To Update the FSM */
\r
667 phHciNfc_Notify_Event(psHciContext, pHwRef,
\r
668 NFC_NOTIFY_TARGET_DISCOVERED,
\r
674 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
\r
682 phHciNfc_ReaderB_InfoUpdate(
\r
683 phHciNfc_sContext_t *psHciContext,
\r
685 uint8_t *reg_value,
\r
689 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
690 phHciNfc_ReaderB_Info_t *p_rdr_b_info=NULL;
\r
691 phHal_sIso14443BInfo_t *p_tag_b_info = NULL;
\r
693 p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
\r
694 (psHciContext->p_reader_b_info );
\r
695 p_tag_b_info = &(p_rdr_b_info->reader_b_info.RemoteDevInfo.Iso14443B_Info);
\r
699 case RDR_B_PUPI_INDEX:
\r
701 HCI_PRINT_BUFFER("\tReader B PUPI", reg_value, reg_length);
\r
702 /* Update PUPI buffer and length in the remote device info,
\r
703 PUPI length is 4 bytes */
\r
704 if(PHHAL_PUPI_LENGTH == reg_length)
\r
706 (void)memcpy((void *)p_tag_b_info->AtqB.AtqResInfo.Pupi,
\r
707 (void *)reg_value, reg_length);
\r
711 status = PHNFCSTVAL(CID_NFC_HCI,
\r
712 NFCSTATUS_INVALID_HCI_RESPONSE);
\r
716 case RDR_B_APP_DATA_INDEX:
\r
718 HCI_PRINT_BUFFER("\tReader B Application data", reg_value, reg_length);
\r
719 /* Update application data buffer and length, 3 bytes,
\r
720 this includes CRC_B and number of application
\r
722 if(PHHAL_APP_DATA_B_LENGTH == reg_length)
\r
724 (void)memcpy((void *)p_tag_b_info->AtqB.AtqResInfo.AppData,
\r
725 (void *)reg_value, reg_length);
\r
729 status = PHNFCSTVAL(CID_NFC_HCI,
\r
730 NFCSTATUS_INVALID_HCI_RESPONSE);
\r
734 case RDR_B_AFI_INDEX:
\r
736 HCI_PRINT_BUFFER("\tReader B AFI", reg_value, reg_length);
\r
737 /* Update AFI byte, Only one byte */
\r
738 if(sizeof(*reg_value) == reg_length)
\r
740 p_tag_b_info->Afi = *reg_value;
\r
744 status = PHNFCSTVAL(CID_NFC_HCI,
\r
745 NFCSTATUS_INVALID_HCI_RESPONSE);
\r
750 case RDR_B_HIGHER_LAYER_RESP_INDEX:
\r
752 HCI_PRINT_BUFFER("\tReader B higher layer response", reg_value, reg_length);
\r
753 /* Update higher layer response buffer and length */
\r
754 if (reg_length <= PHHAL_MAX_ATR_LENGTH)
\r
756 (void)memcpy((void *)p_tag_b_info->HiLayerResp,
\r
757 (void *)reg_value, reg_length);
\r
761 status = PHNFCSTVAL(CID_NFC_HCI,
\r
762 NFCSTATUS_INVALID_HCI_RESPONSE);
\r
767 case RDR_B_HIGHER_LAYER_DATA_INDEX:
\r
769 HCI_PRINT_BUFFER("\tReader B higher layer data", reg_value, reg_length);
\r
770 /* Update higher layer data buffer and length */
\r
775 status = PHNFCSTVAL(CID_NFC_HCI,
\r
776 NFCSTATUS_INVALID_HCI_RESPONSE);
\r
786 phHciNfc_Recv_Iso_B_Packet(
\r
787 phHciNfc_sContext_t *psHciContext,
\r
788 uint8_t *pResponse,
\r
789 #ifdef ONE_BYTE_LEN
\r
796 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
799 psHciContext->rx_index = HCP_HEADER_LEN;
\r
800 /* command WR_XCHG_DATA: so give ISO 14443-4B data to the upper layer */
\r
801 HCI_PRINT_BUFFER("ISO 14443-4B Bytes received", pResponse, length);
\r
802 if(FALSE != pResponse[(length - i)])
\r
804 status = PHNFCSTVAL(CID_NFC_HCI,
\r
805 NFCSTATUS_RF_ERROR);
\r
812 phHciNfc_ReaderB_Set_AFI(
\r
818 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
819 phHciNfc_sContext_t *psHciContext =
\r
820 (phHciNfc_sContext_t *)psContext ;
\r
821 if( (NULL == psHciContext) || (NULL == pHwRef))
\r
823 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
825 else if((NULL == psHciContext->p_reader_b_info) ||
\r
826 (HCI_READER_B_ENABLE !=
\r
827 ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->
\r
828 enable_rdr_b_gate))
\r
830 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
\r
834 phHciNfc_ReaderB_Info_t *ps_rdr_b_info=NULL;
\r
835 phHciNfc_Pipe_Info_t *p_pipe_info=NULL;
\r
836 uint8_t pipeid = 0;
\r
838 ps_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
\r
839 psHciContext->p_reader_b_info ;
\r
840 p_pipe_info = ps_rdr_b_info->p_pipe_info;
\r
841 if(NULL == p_pipe_info )
\r
843 status = PHNFCSTVAL(CID_NFC_HCI,
\r
844 NFCSTATUS_INVALID_HCI_SEQUENCE);
\r
848 pipeid = ps_rdr_b_info->pipe_id ;
\r
849 p_pipe_info->reg_index = RDR_B_AFI_INDEX;
\r
851 p_pipe_info->param_info = &afi_value;
\r
852 p_pipe_info->param_length = sizeof(uint8_t);
\r
853 /* Fill the data buffer and send the command to the
\r
856 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
\r
857 pipeid, (uint8_t)ANY_SET_PARAMETER);
\r
864 phHciNfc_ReaderB_Set_LayerData(
\r
867 phNfc_sData_t *layer_data_info
\r
870 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
871 phHciNfc_sContext_t *psHciContext =
\r
872 (phHciNfc_sContext_t *)psContext ;
\r
874 if( (NULL == psHciContext) || (NULL == pHwRef) ||
\r
875 (NULL == layer_data_info) || (NULL == layer_data_info->buffer)
\r
876 || (0 == layer_data_info->length))
\r
878 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
\r
880 else if((NULL == psHciContext->p_reader_b_info) ||
\r
881 (HCI_READER_B_ENABLE !=
\r
882 ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->
\r
883 enable_rdr_b_gate))
\r
885 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
\r
889 phHciNfc_ReaderB_Info_t *ps_rdr_b_info=NULL;
\r
890 phHciNfc_Pipe_Info_t *p_pipe_info=NULL;
\r
891 uint8_t pipeid = 0;
\r
893 ps_rdr_b_info = (phHciNfc_ReaderB_Info_t *)
\r
894 psHciContext->p_reader_b_info ;
\r
895 p_pipe_info = ps_rdr_b_info->p_pipe_info;
\r
896 if(NULL == p_pipe_info )
\r
898 status = PHNFCSTVAL(CID_NFC_HCI,
\r
899 NFCSTATUS_INVALID_HCI_SEQUENCE);
\r
903 p_pipe_info->reg_index = RDR_B_HIGHER_LAYER_DATA_INDEX;
\r
904 pipeid = ps_rdr_b_info->pipe_id ;
\r
905 p_pipe_info->param_info = (void *)layer_data_info->buffer;
\r
906 p_pipe_info->param_length = (uint8_t)
\r
907 layer_data_info->length;
\r
908 /* Fill the data buffer and send the command to the
\r
910 status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
\r
911 pipeid, (uint8_t)ANY_SET_PARAMETER);
\r
916 #endif /* #if defined (TYPE_B) */
\r