2 * Copyright (C) 2010 NXP Semiconductors
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * =========================================================================== *
21 * \file phHciNfc_Felica.c *
22 * \brief HCI Felica Management Routines. *
25 * Project: NFC-FRI-1.1 *
27 * $Date: Wed Feb 17 16:19:04 2010 $ *
28 * $Author: ing02260 $ *
30 * $Aliases: 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 $
32 * =========================================================================== *
36 ***************************** Header File Inclusion ****************************
38 #include <phNfcCompId.h>
39 #include <phHciNfc_Pipe.h>
40 #include <phHciNfc_RFReader.h>
41 #include <phOsalNfc.h>
43 #if defined(TYPE_FELICA)
44 #include <phHciNfc_Felica.h>
46 ****************************** Macro Definitions *******************************
49 #define FEL_SINGLE_TAG_FOUND 0x00U
50 #define FEL_MULTIPLE_TAGS_FOUND 0x03U
51 #define NXP_WRA_CONTINUE_ACTIVATION 0x12U
53 #define NXP_FEL_SYS_CODE 0x01U
54 #define NXP_FEL_POLREQ_SYS_CODE 0x02U
55 #define NXP_FEL_CURRENTIDM 0x04U
56 #define NXP_FEL_CURRENTPMM 0x05U
58 #define NXP_FEL_SYS_CODE_LEN 0x02U
59 #define NXP_FEL_CUR_IDM_PMM_LEN 0x08U
61 #define FELICA_STATUS 0x00U
63 uint8_t nxp_nfc_felica_timeout = NXP_FELICA_XCHG_TIMEOUT;
65 /* Presence check command for felica tag */
66 #define FELICA_REQ_MODE 0x04U
69 *************************** Structure and Enumeration ***************************
74 *************************** Static Function Declaration **************************
78 phHciNfc_Recv_Felica_Response(
91 phHciNfc_Recv_Felica_Event(
104 phHciNfc_Felica_InfoUpdate(
105 phHciNfc_sContext_t *psHciContext,
113 phHciNfc_Recv_Felica_Packet(
114 phHciNfc_sContext_t *psHciContext,
124 *************************** Function Definitions ***************************
128 phHciNfc_Felica_Get_PipeID(
129 phHciNfc_sContext_t *psHciContext,
133 NFCSTATUS status = NFCSTATUS_SUCCESS;
135 if( (NULL != psHciContext)
136 && ( NULL != ppipe_id )
137 && ( NULL != psHciContext->p_felica_info )
140 phHciNfc_Felica_Info_t *p_fel_info = NULL;
141 p_fel_info = (phHciNfc_Felica_Info_t *)psHciContext->p_felica_info ;
142 *ppipe_id = p_fel_info->pipe_id ;
146 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
153 phHciNfc_Felica_Init_Resources(
154 phHciNfc_sContext_t *psHciContext
157 NFCSTATUS status = NFCSTATUS_SUCCESS;
158 phHciNfc_Felica_Info_t *p_fel_info = NULL;
159 if( NULL == psHciContext )
161 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
166 ( NULL == psHciContext->p_felica_info ) &&
167 (phHciNfc_Allocate_Resource((void **)(&p_fel_info),
168 sizeof(phHciNfc_Felica_Info_t))== NFCSTATUS_SUCCESS)
171 psHciContext->p_felica_info = p_fel_info;
172 p_fel_info->current_seq = FELICA_INVALID_SEQ;
173 p_fel_info->next_seq = FELICA_INVALID_SEQ;
174 p_fel_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
178 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
186 phHciNfc_Felica_Update_PipeInfo(
187 phHciNfc_sContext_t *psHciContext,
189 phHciNfc_Pipe_Info_t *pPipeInfo
192 NFCSTATUS status = NFCSTATUS_SUCCESS;
194 if( NULL == psHciContext )
196 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
198 else if(NULL == psHciContext->p_felica_info)
200 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
204 phHciNfc_Felica_Info_t *p_fel_info=NULL;
205 p_fel_info = (phHciNfc_Felica_Info_t *)psHciContext->p_felica_info ;
207 /* Update the pipe_id of the Felica Gate obtained from the HCI
209 p_fel_info->pipe_id = pipeID;
210 p_fel_info->p_pipe_info = pPipeInfo;
211 /* Update the Response Receive routine of the Felica Gate */
212 pPipeInfo->recv_resp = phHciNfc_Recv_Felica_Response;
213 /* Update the event Receive routine of the Felica Gate */
214 pPipeInfo->recv_event = phHciNfc_Recv_Felica_Event;
221 phHciNfc_Felica_Update_Info(
222 phHciNfc_sContext_t *psHciContext,
227 NFCSTATUS status = NFCSTATUS_SUCCESS;
229 if (NULL == psHciContext)
231 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
233 else if(NULL == psHciContext->p_felica_info)
235 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
239 phHciNfc_Felica_Info_t *p_fel_info=NULL;
240 p_fel_info = (phHciNfc_Felica_Info_t *)
241 psHciContext->p_felica_info ;
245 case HCI_FELICA_ENABLE:
247 if (NULL != fel_info)
249 p_fel_info->enable_felica_gate =
250 *((uint8_t *)fel_info);
254 case HCI_FELICA_INFO_SEQ:
256 p_fel_info->current_seq = FELICA_SYSTEMCODE;
257 p_fel_info->next_seq = FELICA_SYSTEMCODE;
262 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
271 phHciNfc_Felica_Info_Sequence (
276 NFCSTATUS status = NFCSTATUS_SUCCESS;
277 phHciNfc_sContext_t *psHciContext =
278 ((phHciNfc_sContext_t *)psHciHandle);
280 HCI_PRINT ("HCI : phHciNfc_Felica_Info_Sequence called... \n");
281 if( (NULL == psHciContext)
285 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
287 else if((NULL == psHciContext->p_felica_info) ||
288 (HCI_FELICA_ENABLE !=
289 ((phHciNfc_Felica_Info_t *)(psHciContext->p_felica_info))->
292 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
296 phHciNfc_Felica_Info_t *p_fel_info=NULL;
297 phHciNfc_Pipe_Info_t *p_pipe_info=NULL;
300 p_fel_info = (phHciNfc_Felica_Info_t *)
301 psHciContext->p_felica_info ;
302 p_pipe_info = p_fel_info->p_pipe_info;
303 if(NULL == p_pipe_info )
305 status = PHNFCSTVAL(CID_NFC_HCI,
306 NFCSTATUS_INVALID_HCI_SEQUENCE);
310 HCI_DEBUG ("HCI : p_fel_info->current_seq : %02X\n", p_fel_info->current_seq);
311 switch(p_fel_info->current_seq)
313 case FELICA_SYSTEMCODE:
315 p_pipe_info->reg_index = NXP_FEL_SYS_CODE;
316 pipeid = p_fel_info->pipe_id ;
317 /* Fill the data buffer and send the command to the
320 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
321 pipeid, (uint8_t)ANY_GET_PARAMETER);
322 if(NFCSTATUS_PENDING == status )
324 p_fel_info->next_seq = FELICA_CURRENTIDM;
328 case FELICA_CURRENTIDM:
330 p_pipe_info->reg_index = NXP_FEL_CURRENTIDM;
331 pipeid = p_fel_info->pipe_id ;
332 /* Fill the data buffer and send the command to the
335 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
336 pipeid, (uint8_t)ANY_GET_PARAMETER);
337 if(NFCSTATUS_PENDING == status )
339 p_fel_info->next_seq = FELICA_CURRENTPMM;
343 case FELICA_CURRENTPMM:
345 p_pipe_info->reg_index = NXP_FEL_CURRENTPMM;
346 pipeid = p_fel_info->pipe_id ;
347 /* Fill the data buffer and send the command to the
350 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
351 pipeid, (uint8_t)ANY_GET_PARAMETER);
352 if(NFCSTATUS_PENDING == status )
354 p_fel_info->next_seq = FELICA_END_SEQUENCE;
358 case FELICA_END_SEQUENCE:
360 phNfc_sCompletionInfo_t CompInfo;
361 if (FEL_MULTIPLE_TAGS_FOUND ==
362 p_fel_info->multiple_tgts_found)
364 CompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
368 CompInfo.status = NFCSTATUS_SUCCESS;
371 CompInfo.info = &(p_fel_info->felica_info);
373 p_fel_info->felica_info.RemDevType = phHal_eFelica_PICC;
374 p_fel_info->current_seq = FELICA_SYSTEMCODE;
375 p_fel_info->next_seq = FELICA_SYSTEMCODE;
376 status = NFCSTATUS_SUCCESS;
377 HCI_DEBUG ("HCI : p_fel_info->felica_info.RemDevType : %02X\n", p_fel_info->felica_info.RemDevType);
378 HCI_DEBUG ("HCI : status notified: %02X\n", CompInfo.status);
379 /* Notify to the upper layer */
380 phHciNfc_Tag_Notify(psHciContext,
382 NFC_NOTIFY_TARGET_DISCOVERED,
388 status = PHNFCSTVAL(CID_NFC_HCI,
389 NFCSTATUS_INVALID_HCI_RESPONSE);
393 HCI_DEBUG ("HCI : p_fel_info->current_seq after : %02X\n", p_fel_info->current_seq);
394 HCI_DEBUG ("HCI : p_fel_info->next_seq : %02X\n", p_fel_info->next_seq);
397 HCI_PRINT ("HCI : phHciNfc_Felica_Info_Sequence end\n");
403 phHciNfc_Felica_InfoUpdate(
404 phHciNfc_sContext_t *psHciContext,
410 NFCSTATUS status = NFCSTATUS_SUCCESS;
411 phHciNfc_Felica_Info_t *p_fel_info=NULL;
412 phHal_sFelicaInfo_t *p_fel_tag_info = NULL;
414 p_fel_info = (phHciNfc_Felica_Info_t *)(psHciContext->p_felica_info );
415 p_fel_tag_info = &(p_fel_info->felica_info.RemoteDevInfo.Felica_Info);
419 case NXP_FEL_SYS_CODE:
421 if (NXP_FEL_SYS_CODE_LEN == reg_length)
423 /* System code from registry is invalid in this case */
424 p_fel_tag_info->SystemCode[0] = 0;
425 p_fel_tag_info->SystemCode[1] = 0;
429 status = PHNFCSTVAL(CID_NFC_HCI,
430 NFCSTATUS_INVALID_HCI_RESPONSE);
434 case NXP_FEL_CURRENTIDM:
436 if (NXP_FEL_CUR_IDM_PMM_LEN == reg_length)
438 HCI_PRINT_BUFFER("\tFelica ID data", reg_value, reg_length);
439 /* Update current PM values */
440 (void)memcpy(p_fel_tag_info->IDm, reg_value,
442 p_fel_tag_info->IDmLength = reg_length;
446 status = PHNFCSTVAL(CID_NFC_HCI,
447 NFCSTATUS_INVALID_HCI_RESPONSE);
451 case NXP_FEL_CURRENTPMM:
453 if (NXP_FEL_CUR_IDM_PMM_LEN == reg_length)
455 HCI_PRINT_BUFFER("\tFelica PM data", reg_value, reg_length);
456 /* Update current PM values */
457 (void)memcpy(p_fel_tag_info->PMm, reg_value,
462 status = PHNFCSTVAL(CID_NFC_HCI,
463 NFCSTATUS_INVALID_HCI_RESPONSE);
469 status = PHNFCSTVAL(CID_NFC_HCI,
470 NFCSTATUS_INVALID_HCI_RESPONSE);
480 phHciNfc_Recv_Felica_Packet(
481 phHciNfc_sContext_t *psHciContext,
491 NFCSTATUS status = NFCSTATUS_SUCCESS;
494 /* To remove "warning (VS C4100) : unreferenced formal parameter" */
496 PHNFC_UNUSED_VARIABLE(length);
498 if (NXP_FELICA_RAW == cmd)
500 if (FELICA_STATUS == pResponse[index]) /* Status byte */
503 psHciContext->rx_index = (HCP_HEADER_LEN + 1);
504 HCI_PRINT_BUFFER("Felica Bytes received", &pResponse[index], (length - index));
505 /* If Poll response received then update IDm and PMm parameters, when presence check going on */
506 if (pResponse[index + 1] == 0x01)
511 (void) memcpy(psHciContext->p_target_info->RemoteDevInfo.Felica_Info.IDm,
512 &pResponse[index + 2], 8);
514 (void) memcpy(psHciContext->p_target_info->RemoteDevInfo.Felica_Info.PMm,
515 &pResponse[index + 2 + 8], 8);
516 index = index + 2 + 8 + 8;
521 /* Copy SC if available */
522 psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[0] = pResponse[index];
523 psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[1] = pResponse[index + 1];
527 /* If SC is not available in packet then set to zero */
528 psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[0] = 0;
529 psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[1] = 0;
534 status = PHNFCSTVAL(CID_NFC_HCI,
535 NFCSTATUS_INVALID_HCI_RESPONSE);
541 status = PHNFCSTVAL(CID_NFC_HCI,
542 NFCSTATUS_INVALID_HCI_RESPONSE);
547 psHciContext->rx_index = HCP_HEADER_LEN;
549 /* command NXP_FELICA_CMD: so give Felica data to the upper layer */
550 HCI_PRINT_BUFFER("Felica Bytes received", pResponse, length);
559 phHciNfc_Recv_Felica_Response(
570 NFCSTATUS status = NFCSTATUS_SUCCESS;
571 phHciNfc_sContext_t *psHciContext =
572 (phHciNfc_sContext_t *)psContext ;
575 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
578 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
580 else if(NULL == psHciContext->p_felica_info)
582 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
586 phHciNfc_Felica_Info_t *p_fel_info=NULL;
587 uint8_t prev_cmd = ANY_GET_PARAMETER;
588 p_fel_info = (phHciNfc_Felica_Info_t *)
589 psHciContext->p_felica_info ;
590 if( NULL == p_fel_info->p_pipe_info)
592 status = PHNFCSTVAL(CID_NFC_HCI,
593 NFCSTATUS_INVALID_HCI_SEQUENCE);
597 prev_cmd = p_fel_info->p_pipe_info->prev_msg ;
600 case ANY_GET_PARAMETER:
602 status = phHciNfc_Felica_InfoUpdate(psHciContext,
603 p_fel_info->p_pipe_info->reg_index,
604 &pResponse[HCP_HEADER_LEN],
605 (uint8_t)(length - HCP_HEADER_LEN));
608 case ANY_SET_PARAMETER:
610 HCI_PRINT("Felica Parameter Set \n");
611 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
613 p_fel_info->next_seq = FELICA_SYSTEMCODE;
618 HCI_PRINT("Felica open pipe complete\n");
619 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
621 p_fel_info->next_seq = FELICA_SYSTEMCODE;
626 HCI_PRINT("Felica close pipe complete\n");
627 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
636 HCI_PRINT("Felica packet received \n");
637 if (length >= HCP_HEADER_LEN)
639 phHciNfc_Append_HCPFrame(psHciContext->recv_buffer,
640 0, pResponse, length);
641 psHciContext->rx_total = length;
642 status = phHciNfc_Recv_Felica_Packet(psHciContext,
644 &pResponse[HCP_HEADER_LEN],
645 (length - HCP_HEADER_LEN));
649 status = PHNFCSTVAL(CID_NFC_HCI,
650 NFCSTATUS_INVALID_HCI_RESPONSE);
654 case NXP_WRA_CONTINUE_ACTIVATION:
655 case NXP_WR_ACTIVATE_ID:
657 HCI_PRINT("Felica continue activation or ");
658 HCI_PRINT("reactivation completed \n");
659 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
663 case NXP_WR_PRESCHECK:
665 HCI_PRINT("Presence check completed \n");
668 case NXP_WR_ACTIVATE_NEXT:
670 HCI_PRINT("Activate next completed \n");
671 if (length > HCP_HEADER_LEN)
673 if (FEL_MULTIPLE_TAGS_FOUND == pResponse[HCP_HEADER_LEN])
675 p_fel_info->multiple_tgts_found =
676 FEL_MULTIPLE_TAGS_FOUND;
680 p_fel_info->multiple_tgts_found = FALSE;
685 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
689 case NXP_WR_DISPATCH_TO_UICC:
695 /* Optional error code, if no error code field
696 in the response, then this command is
697 successfully completed */
698 p_fel_info->uicc_activation =
699 UICC_CARD_ACTIVATION_SUCCESS;
702 case (HCP_HEADER_LEN + 1):
704 p_fel_info->uicc_activation =
705 pResponse[HCP_HEADER_LEN];
707 } /* End of case (HCP_HEADER_LEN + index) */
710 status = PHNFCSTVAL(CID_NFC_HCI,
711 NFCSTATUS_INVALID_HCI_RESPONSE);
715 if (NFCSTATUS_SUCCESS == status)
717 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
724 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
728 if( NFCSTATUS_SUCCESS == status )
730 p_fel_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;
731 p_fel_info->current_seq = p_fel_info->next_seq;
741 phHciNfc_Recv_Felica_Event(
752 NFCSTATUS status = NFCSTATUS_SUCCESS;
753 phHciNfc_sContext_t *psHciContext =
754 (phHciNfc_sContext_t *)psContext ;
756 HCI_PRINT ("HCI : phHciNfc_Recv_Felica_Event called...\n");
757 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
760 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
762 else if((NULL == psHciContext->p_felica_info) ||
763 (HCI_FELICA_ENABLE !=
764 ((phHciNfc_Felica_Info_t *)(psHciContext->p_felica_info))->
767 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
771 phHciNfc_HCP_Packet_t *p_packet = NULL;
772 phHciNfc_Felica_Info_t *p_fel_info = NULL;
773 phHciNfc_HCP_Message_t *message = NULL;
774 uint8_t instruction=0,
777 p_fel_info = (phHciNfc_Felica_Info_t *)
778 psHciContext->p_felica_info ;
779 p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
780 message = &p_packet->msg.message;
781 /* Get the instruction bits from the Message Header */
782 instruction = (uint8_t) GET_BITS8( message->msg_header,
783 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
785 HCI_DEBUG ("HCI : instruction : %02X\n", instruction);
786 HCI_DEBUG ("HCI : Multiple tag found : %02X\n", message->payload[i]);
787 if ((EVT_TARGET_DISCOVERED == instruction)
788 && ((FEL_MULTIPLE_TAGS_FOUND == message->payload[i] )
789 || (FEL_SINGLE_TAG_FOUND == message->payload[i]))
792 static phNfc_sCompletionInfo_t pCompInfo;
794 if (FEL_MULTIPLE_TAGS_FOUND == message->payload[i])
796 p_fel_info->multiple_tgts_found = FEL_MULTIPLE_TAGS_FOUND;
797 pCompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
801 p_fel_info->multiple_tgts_found = FALSE;
802 pCompInfo.status = NFCSTATUS_SUCCESS;
805 HCI_DEBUG ("HCI : psHciContext->host_rf_type : %02X\n", psHciContext->host_rf_type);
806 HCI_DEBUG ("HCI : p_fel_info->felica_info.RemDevType : %02X\n", p_fel_info->felica_info.RemDevType);
807 HCI_DEBUG ("HCI : p_fel_info->current_seq : %02X\n", p_fel_info->current_seq);
809 psHciContext->host_rf_type = phHal_eFelica_PCD;
810 p_fel_info->felica_info.RemDevType = phHal_eFelica_PICC;
811 p_fel_info->current_seq = FELICA_SYSTEMCODE;
813 /* Notify to the HCI Generic layer To Update the FSM */
814 phHciNfc_Notify_Event(psHciContext, pHwRef,
815 NFC_NOTIFY_TARGET_DISCOVERED,
821 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
824 HCI_PRINT ("HCI : phHciNfc_Recv_Felica_Event end\n");
830 phHciNfc_Felica_Request_Mode(
831 phHciNfc_sContext_t *psHciContext,
834 NFCSTATUS status = NFCSTATUS_SUCCESS;
835 static uint8_t pres_chk_data[6] = {0};
837 if( (NULL == psHciContext) || (NULL == pHwRef) )
839 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
843 phHciNfc_Felica_Info_t *ps_fel_info = NULL;
844 phHciNfc_Pipe_Info_t *ps_pipe_info = NULL;
845 phHal_sFelicaInfo_t *ps_rem_fel_info = NULL;
847 ps_fel_info = (phHciNfc_Felica_Info_t *)
848 psHciContext->p_felica_info ;
849 ps_pipe_info = ps_fel_info->p_pipe_info;
851 if(NULL == ps_pipe_info )
853 status = PHNFCSTVAL(CID_NFC_HCI,
854 NFCSTATUS_INVALID_HCI_SEQUENCE);
859 &(ps_fel_info->felica_info.RemoteDevInfo.Felica_Info);
861 pres_chk_data[0] = sizeof(pres_chk_data);
862 pres_chk_data[1] = 0x00; // Felica poll
863 pres_chk_data[2] = 0xFF;
864 pres_chk_data[3] = 0xFF;
865 pres_chk_data[4] = 0x01;
866 pres_chk_data[5] = 0x00;
868 ps_pipe_info->param_info = pres_chk_data;
869 ps_pipe_info->param_length = sizeof(pres_chk_data);
870 status = phHciNfc_Send_Felica_Command(
871 psHciContext, pHwRef,
872 ps_pipe_info->pipe.pipe_id,
881 phHciNfc_Send_Felica_Command(
882 phHciNfc_sContext_t *psContext,
888 NFCSTATUS status = NFCSTATUS_SUCCESS;
889 phHciNfc_sContext_t *psHciContext =
890 (phHciNfc_sContext_t *)psContext ;
891 if( (NULL == psHciContext) || (NULL == pHwRef) )
893 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
895 else if((NULL == psHciContext->p_felica_info) ||
896 (HCI_FELICA_ENABLE !=
897 ((phHciNfc_Felica_Info_t *)(psHciContext->p_felica_info))->
898 enable_felica_gate) ||
899 (HCI_UNKNOWN_PIPE_ID ==
900 ((phHciNfc_Felica_Info_t *)(psHciContext->p_felica_info))->
903 ((phHciNfc_Felica_Info_t *)(psHciContext->p_felica_info))->
906 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
910 phHciNfc_Felica_Info_t *p_fel_info=NULL;
911 phHciNfc_Pipe_Info_t *p_pipe_info=NULL;
912 phHciNfc_HCP_Packet_t *hcp_packet = NULL;
913 phHciNfc_HCP_Message_t *hcp_message = NULL;
915 length = HCP_HEADER_LEN;
917 p_fel_info = (phHciNfc_Felica_Info_t *)
918 psHciContext->p_felica_info ;
919 p_pipe_info = p_fel_info->p_pipe_info;
920 if(NULL == p_pipe_info )
922 status = PHNFCSTVAL(CID_NFC_HCI,
923 NFCSTATUS_INVALID_HCI_SEQUENCE);
927 psHciContext->tx_total = 0 ;
928 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
929 /* Construct the HCP Frame */
930 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
931 (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
937 Buffer shall be updated with
938 TO - Time out (1 byte)
939 Status - b0 to b2 indicate valid bits (1 byte)
940 Data - params received from this function
942 hcp_message = &(hcp_packet->msg.message);
945 hcp_message->payload[i++] = nxp_nfc_felica_timeout ;
947 hcp_message->payload[i++] = FELICA_STATUS;
949 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
950 i, (uint8_t *)p_pipe_info->param_info,
951 p_pipe_info->param_length);
952 length =(uint8_t)(length + i + p_pipe_info->param_length);
958 Buffer shall be updated with
959 Cmd - Authentication A/B, read/write
961 Data - params received from this function
963 hcp_message = &(hcp_packet->msg.message);
966 hcp_message->payload[i++] =
967 psHciContext->p_xchg_info->params.tag_info.cmd_type ;
968 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
969 i, (uint8_t *)p_pipe_info->param_info,
970 p_pipe_info->param_length);
971 length =(uint8_t)(length + i + p_pipe_info->param_length);
976 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_COMMAND);
980 if (NFCSTATUS_SUCCESS == status)
982 p_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_COMMAND;
983 p_pipe_info->prev_msg = cmd;
984 psHciContext->tx_total = length;
985 psHciContext->response_pending = TRUE;
987 /* Send the Constructed HCP packet to the lower layer */
988 status = phHciNfc_Send_HCP( psHciContext, pHwRef);
989 p_pipe_info->prev_status = status;
996 #endif /* #if defined(TYPE_FELICA) */