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_RFReader.c *
22 * \brief HCI RF Reader Management Gate Routines. *
23 * *
24 * *
25 * Project: NFC-FRI-1.1 *
26 * *
27 * $Date: Wed Apr 21 12:21:15 2010 $ *
28 * $Author: ing07385 $ *
29 * $Revision: 1.53 $ *
30 * $Aliases: NFC_FRI1.1_WK1007_R33_6 $ *
31 * *
32 * =========================================================================== *
33 */
34
35 /*
36 ***************************** Header File Inclusion ****************************
37 */
38 #include <phNfcConfig.h>
39 #include <phNfcCompId.h>
40 #include <phHciNfc_Pipe.h>
41 #include <phHciNfc_RFReader.h>
42 #include <phHciNfc_RFReaderA.h>
43 #ifdef TYPE_B
44 #include <phHciNfc_RFReaderB.h>
45 #endif
46 #ifdef ENABLE_P2P
47 #include <phHciNfc_NfcIPMgmt.h>
48 #endif
49 #ifdef TYPE_FELICA
50 #include <phHciNfc_Felica.h>
51 #endif
52 #ifdef TYPE_JEWEL
53 #include <phHciNfc_Jewel.h>
54 #endif
55 #ifdef TYPE_ISO15693
56 #include <phHciNfc_ISO15693.h>
57 #endif /* #ifdef TYPE_ISO15693 */
58 #include <phOsalNfc.h>
59
60 /*
61 ****************************** Macro Definitions *******************************
62 */
63
64 #define NFCIP_ACTIVATE_DELAY 0x05U
65
66 uint8_t nxp_nfc_isoxchg_timeout = NXP_ISO_XCHG_TIMEOUT;
67 /*
68 *************************** Structure and Enumeration ***************************
69 */
70
71
72 /** \defgroup grp_hci_nfc HCI Reader RF Management Component
73 *
74 *
75 */
76
77
78 typedef enum phHciNfc_ReaderMgmt_Seq{
79 READERA_PIPE_OPEN = 0x00U,
80 READERB_PIPE_OPEN,
81 FELICA_PROP_PIPE_OPEN,
82 JEWEL_PROP_PIPE_OPEN,
83 ISO15693_PROP_PIPE_OPEN,
84 NFCIP1_INITIATOR_PIPE_OPEN,
85 NFCIP1_INITIATOR_MODE_CONFIG,
86 NFCIP1_INITIATOR_PSL1_CONFIG,
87 NFCIP1_INITIATOR_PSL2_CONFIG,
88 READERA_DISABLE_AUTO_ACTIVATE,
89
90
91 READERA_PIPE_CLOSE,
92 READERB_PIPE_CLOSE,
93 FELICA_PROP_PIPE_CLOSE,
94 JEWEL_PROP_PIPE_CLOSE,
95 ISO15693_PROP_PIPE_CLOSE,
96 NFCIP1_INITIATOR_PIPE_CLOSE,
97 END_READER_SEQUENCE
98 } phHciNfc_ReaderMgmt_Seq_t;
99
100 typedef struct phHciNfc_ReaderMgmt_Info{
101 phHciNfc_ReaderMgmt_Seq_t rf_gate_cur_seq;
102 phHciNfc_ReaderMgmt_Seq_t rf_gate_next_seq;
103 } phHciNfc_ReaderMgmt_Info_t;
104
105
106 /*
107 *************************** Static Function Declaration **************************
108 */
109 static
110 NFCSTATUS
111 phHciNfc_ReaderMgmt_End_Discovery(
112 phHciNfc_sContext_t *psHciContext,
113 void *pHwRef,
114 uint8_t reader_pipe_id
115 );
116
117 static
118 NFCSTATUS
119 phHciNfc_ReaderMgmt_Initiate_Discovery(
120 phHciNfc_sContext_t *psHciContext,
121 void *pHwRef,
122 uint8_t reader_pipe_id
123 );
124
125 /*
126 *************************** Function Definitions ***************************
127 */
128
129 #ifdef READER_INIT
130 /*!
131 * \brief Allocates the resources of RF Reader Managment Gate.
132 *
133 * This function Allocates the resources of the RF Reader Management
134 * gate Information Structure.
135 *
136 */
137
138 NFCSTATUS
phHciNfc_ReaderMgmt_Init_Resources(phHciNfc_sContext_t * psHciContext)139 phHciNfc_ReaderMgmt_Init_Resources(
140 phHciNfc_sContext_t *psHciContext
141 )
142 {
143 NFCSTATUS status = NFCSTATUS_SUCCESS;
144 phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL;
145 if( NULL == psHciContext )
146 {
147 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
148 }
149 else
150 {
151 if( ( NULL == psHciContext->p_reader_mgmt_info )
152 && (phHciNfc_Allocate_Resource((void **)(&p_reader_mgmt_info),
153 sizeof(phHciNfc_ReaderMgmt_Info_t))== NFCSTATUS_SUCCESS)
154 )
155 {
156 psHciContext->p_reader_mgmt_info = p_reader_mgmt_info;
157 p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN;
158 p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE;
159 }
160 else
161 {
162 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
163 }
164 }
165 return status;
166 }
167
168 #endif
169
170 /*!
171 * \brief Updates the Sequence of RF Reader Managment Gate.
172 *
173 * This function Resets/Updates the sequence of the RF Reader Management
174 * gate.
175 *
176 */
177
178 NFCSTATUS
phHciNfc_ReaderMgmt_Update_Sequence(phHciNfc_sContext_t * psHciContext,phHciNfc_eSeqType_t reader_seq)179 phHciNfc_ReaderMgmt_Update_Sequence(
180 phHciNfc_sContext_t *psHciContext,
181 phHciNfc_eSeqType_t reader_seq
182 )
183 {
184 NFCSTATUS status = NFCSTATUS_SUCCESS;
185 phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info = NULL;
186 if( NULL == psHciContext )
187 {
188 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
189 }
190 else
191 {
192 if( NULL == psHciContext->p_reader_mgmt_info )
193 {
194 status = PHNFCSTVAL(CID_NFC_HCI,
195 NFCSTATUS_INVALID_HCI_INFORMATION);
196 }
197 else
198 {
199 p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
200 psHciContext->p_reader_mgmt_info ;
201 switch(reader_seq)
202 {
203 case RESET_SEQ:
204 case INIT_SEQ:
205 {
206 p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN;
207 p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE;
208 break;
209 }
210 case UPDATE_SEQ:
211 {
212 p_reader_mgmt_info->rf_gate_cur_seq =
213 p_reader_mgmt_info->rf_gate_next_seq;
214 break;
215 }
216 case INFO_SEQ:
217 {
218 status = phHciNfc_ReaderA_Update_Info(psHciContext,
219 HCI_READER_A_INFO_SEQ, NULL);
220 #if defined( TYPE_B )
221 status = phHciNfc_ReaderB_Update_Info(psHciContext,
222 HCI_READER_B_INFO_SEQ, NULL);
223 #endif /* end of #if defined(TYPE_B) */
224 #if defined( TYPE_FELICA )
225 status = phHciNfc_Felica_Update_Info(psHciContext,
226 HCI_FELICA_INFO_SEQ, NULL);
227 #endif /* end of #if defined(TYPE_FELICA) */
228 #if defined( TYPE_JEWEL )
229 status = phHciNfc_Jewel_Update_Info(psHciContext,
230 HCI_JEWEL_INFO_SEQ, NULL);
231 #endif /* end of #if defined(TYPE_JEWEL) */
232 #if defined( TYPE_ISO15693 )
233 status = phHciNfc_ISO15693_Update_Info(psHciContext,
234 HCI_ISO_15693_INFO_SEQ, NULL);
235 #endif /* end of #if defined(TYPE_ISO15693) */
236 break;
237 }
238 case REL_SEQ:
239 {
240 p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_CLOSE;
241 p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE;
242 break;
243 }
244 default:
245 {
246 break;
247 }
248 }
249 }
250 }
251
252 return status;
253
254 }
255
256
257 /*!
258 * \brief Initialisation of RF Reader Managment Gate.
259 *
260 * This function initialses the RF Reader Management gate and
261 * populates the Reader Management Information Structure
262 *
263 */
264
265 NFCSTATUS
phHciNfc_ReaderMgmt_Initialise(phHciNfc_sContext_t * psHciContext,void * pHwRef)266 phHciNfc_ReaderMgmt_Initialise(
267 phHciNfc_sContext_t *psHciContext,
268 void *pHwRef
269 )
270 {
271 NFCSTATUS status = NFCSTATUS_SUCCESS;
272 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
273 phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL;
274
275 if( NULL == psHciContext )
276 {
277 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
278 }
279 else
280 {
281
282 if( ( NULL == psHciContext->p_reader_mgmt_info )
283 && (phHciNfc_Allocate_Resource((void **)(&p_reader_mgmt_info),
284 sizeof(phHciNfc_ReaderMgmt_Info_t))== NFCSTATUS_SUCCESS)
285 )
286 {
287 psHciContext->p_reader_mgmt_info = p_reader_mgmt_info;
288 p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN;
289 p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE;
290 }
291 else
292 {
293 p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
294 psHciContext->p_reader_mgmt_info ;
295 }
296
297 if( NULL == psHciContext->p_reader_mgmt_info )
298 {
299 status = PHNFCSTVAL(CID_NFC_HCI,
300 NFCSTATUS_INSUFFICIENT_RESOURCES);
301 }
302 #ifdef ESTABLISH_SESSION
303 else if( hciMode_Session == psHciContext->hci_mode )
304 {
305 status = NFCSTATUS_SUCCESS;
306 }
307 #endif
308 else
309 {
310 switch(p_reader_mgmt_info->rf_gate_cur_seq )
311 {
312 /* Reader A pipe open sequence */
313 case READERA_PIPE_OPEN:
314 {
315 p_pipe_info = ((phHciNfc_ReaderA_Info_t *)
316 psHciContext->p_reader_a_info)->p_pipe_info;
317 if(NULL == p_pipe_info )
318 {
319 status = PHNFCSTVAL(CID_NFC_HCI,
320 NFCSTATUS_INVALID_HCI_SEQUENCE);
321 }
322 else
323 {
324 status = phHciNfc_Open_Pipe( psHciContext,
325 pHwRef, p_pipe_info );
326 if(status == NFCSTATUS_SUCCESS)
327 {
328 uint8_t rdr_enable = TRUE;
329 status = phHciNfc_ReaderA_Update_Info(
330 psHciContext, HCI_READER_A_ENABLE,
331 &rdr_enable);
332 #if defined( TYPE_B ) && defined ( ENABLE_AUTO_ACTIVATE )
333 p_reader_mgmt_info->rf_gate_next_seq =
334 READERB_PIPE_OPEN;
335 status = NFCSTATUS_PENDING;
336 /* end of #ifdef TYPE_B */
337 #elif !defined( ENABLE_AUTO_ACTIVATE )
338 p_reader_mgmt_info->rf_gate_next_seq =
339 READERA_DISABLE_AUTO_ACTIVATE;
340 status = NFCSTATUS_PENDING;
341 /* #ifdef ENABLE_AUTO_ACTIVATE */
342 #elif defined( ENABLE_P2P )
343 p_reader_mgmt_info->rf_gate_next_seq =
344 NFCIP1_INITIATOR_PIPE_OPEN;
345 status = NFCSTATUS_PENDING;
346 /* #ifdef ENABLE_P2P */
347 #else
348 p_reader_mgmt_info->rf_gate_next_seq =
349 END_READER_SEQUENCE;
350 /* status = NFCSTATUS_PENDING; */
351 #endif
352 }
353 }
354 break;
355 }
356 /* Reader A Auto Activate Disable */
357 case READERA_DISABLE_AUTO_ACTIVATE:
358 {
359 uint8_t activate_enable = FALSE;
360 p_pipe_info = ((phHciNfc_ReaderA_Info_t *)
361 psHciContext->p_reader_a_info)->p_pipe_info;
362 if(NULL == p_pipe_info )
363 {
364 status = PHNFCSTVAL(CID_NFC_HCI,
365 NFCSTATUS_INVALID_HCI_SEQUENCE);
366 }
367 else
368 {
369
370 status = phHciNfc_ReaderA_Auto_Activate( psHciContext,
371 pHwRef, activate_enable );
372 if(status == NFCSTATUS_SUCCESS)
373 {
374 #if defined (TYPE_B)
375 p_reader_mgmt_info->rf_gate_next_seq =
376 READERB_PIPE_OPEN;
377 status = NFCSTATUS_PENDING;
378 /* end of #ifdef TYPE_B */
379 #elif defined(TYPE_FELICA)
380 p_reader_mgmt_info->rf_gate_next_seq =
381 FELICA_PROP_PIPE_OPEN;
382 status = NFCSTATUS_PENDING;
383 /* end of #elif defined(TYPE_FELICA) */
384 #elif defined(TYPE_JEWEL)
385 p_reader_mgmt_info->rf_gate_next_seq =
386 JEWEL_PROP_PIPE_OPEN;
387 status = NFCSTATUS_PENDING;
388 /* end of #elif defined(TYPE_JEWEL) */
389 #elif defined (TYPE_ISO15693)
390 p_reader_mgmt_info->rf_gate_next_seq =
391 ISO15693_PROP_PIPE_OPEN;
392 status = NFCSTATUS_PENDING;
393 /* end of #elif defined(TYPE_ISO15693) */
394 #elif defined(ENABLE_P2P)
395 p_reader_mgmt_info->rf_gate_next_seq =
396 NFCIP1_INITIATOR_PIPE_OPEN;
397 status = NFCSTATUS_PENDING;
398 /* end of #ifdef ENABLE_P2P */
399 #else
400 p_reader_mgmt_info->rf_gate_next_seq =
401 END_READER_SEQUENCE;
402 /* status = NFCSTATUS_PENDING; */
403 #endif /* #if !defined(ENABLE_P2P) && !defined(TYPE_B)*/
404 }
405 }
406 break;
407 }
408 #ifdef TYPE_B
409 /* Reader B pipe open sequence */
410 case READERB_PIPE_OPEN:
411 {
412 p_pipe_info = ((phHciNfc_ReaderB_Info_t *)
413 psHciContext->p_reader_b_info)->p_pipe_info;
414 if(NULL == p_pipe_info )
415 {
416 status = PHNFCSTVAL(CID_NFC_HCI,
417 NFCSTATUS_INVALID_HCI_SEQUENCE);
418 }
419 else
420 {
421 status = phHciNfc_Open_Pipe( psHciContext,
422 pHwRef, p_pipe_info );
423 if(status == NFCSTATUS_SUCCESS)
424 {
425 #if defined(TYPE_FELICA)
426 p_reader_mgmt_info->rf_gate_next_seq =
427 FELICA_PROP_PIPE_OPEN;
428 status = NFCSTATUS_PENDING;
429 /* end of #ifdef TYPE_FELICA */
430 #elif defined(TYPE_JEWEL)
431 p_reader_mgmt_info->rf_gate_next_seq =
432 JEWEL_PROP_PIPE_OPEN;
433 status = NFCSTATUS_PENDING;
434 /* end of #elif defined(TYPE_JEWEL) */
435 #elif defined (TYPE_ISO15693)
436 p_reader_mgmt_info->rf_gate_next_seq =
437 ISO15693_PROP_PIPE_OPEN;
438 status = NFCSTATUS_PENDING;
439 /* end of #elif defined(TYPE_ISO15693) */
440 #elif defined(ENABLE_P2P)
441 p_reader_mgmt_info->rf_gate_next_seq =
442 NFCIP1_INITIATOR_PIPE_OPEN;
443 status = NFCSTATUS_PENDING;
444 /* end of #ifdef ENABLE_P2P */
445 #else
446 p_reader_mgmt_info->rf_gate_next_seq =
447 END_READER_SEQUENCE;
448 /* status = NFCSTATUS_PENDING; */
449 #endif /* #if !defined(ENABLE_P2P) && !defined(TYPE_FELICA)*/
450 }
451 }
452 break;
453 }
454 #endif /* #ifdef TYPE_B */
455 #ifdef TYPE_FELICA
456 /* Felica Reader pipe open sequence */
457 case FELICA_PROP_PIPE_OPEN:
458 {
459 p_pipe_info = ((phHciNfc_Felica_Info_t *)
460 psHciContext->p_felica_info)->p_pipe_info;
461 if(NULL == p_pipe_info )
462 {
463 status = PHNFCSTVAL(CID_NFC_HCI,
464 NFCSTATUS_INVALID_HCI_SEQUENCE);
465 }
466 else
467 {
468 status = phHciNfc_Open_Pipe( psHciContext,
469 pHwRef, p_pipe_info );
470 if(status == NFCSTATUS_SUCCESS)
471 {
472 #if defined(TYPE_JEWEL)
473 p_reader_mgmt_info->rf_gate_next_seq =
474 JEWEL_PROP_PIPE_OPEN;
475 status = NFCSTATUS_PENDING;
476 /* end of #if defined(TYPE_JEWEL) */
477 #elif defined (TYPE_ISO15693)
478 p_reader_mgmt_info->rf_gate_next_seq =
479 ISO15693_PROP_PIPE_OPEN;
480 status = NFCSTATUS_PENDING;
481 /* end of #elif defined(TYPE_ISO15693) */
482 #elif defined(ENABLE_P2P)
483 p_reader_mgmt_info->rf_gate_next_seq =
484 NFCIP1_INITIATOR_PIPE_OPEN;
485 status = NFCSTATUS_PENDING;
486 /* end of #ifdef ENABLE_P2P */
487 #else
488 p_reader_mgmt_info->rf_gate_next_seq =
489 END_READER_SEQUENCE;
490 /* status = NFCSTATUS_PENDING; */
491 #endif /* #if !defined(ENABLE_P2P) */
492 }
493 }
494 break;
495 }
496 #endif
497 #ifdef TYPE_JEWEL
498 /* Jewel Reader pipe open sequence */
499 case JEWEL_PROP_PIPE_OPEN:
500 {
501 p_pipe_info = ((phHciNfc_Jewel_Info_t *)
502 psHciContext->p_jewel_info)->p_pipe_info;
503 if(NULL == p_pipe_info )
504 {
505 status = PHNFCSTVAL(CID_NFC_HCI,
506 NFCSTATUS_INVALID_HCI_SEQUENCE);
507 }
508 else
509 {
510 status = phHciNfc_Open_Pipe( psHciContext,
511 pHwRef, p_pipe_info );
512 if(status == NFCSTATUS_SUCCESS)
513 {
514 #if defined (TYPE_ISO15693)
515 p_reader_mgmt_info->rf_gate_next_seq =
516 ISO15693_PROP_PIPE_OPEN;
517 status = NFCSTATUS_PENDING;
518 /* end of #if defined(TYPE_ISO15693) */
519 #elif defined (ENABLE_P2P)
520 p_reader_mgmt_info->rf_gate_next_seq =
521 NFCIP1_INITIATOR_PIPE_OPEN;
522 status = NFCSTATUS_PENDING;
523 /* end of #ifdef ENABLE_P2P */
524 #else
525 p_reader_mgmt_info->rf_gate_next_seq =
526 END_READER_SEQUENCE;
527 /* status = NFCSTATUS_PENDING; */
528 #endif /* #if !defined(ENABLE_P2P) */
529 }
530 }
531 break;
532 }
533 #endif
534
535 #ifdef TYPE_ISO15693
536 /* ISO15693 Reader pipe open sequence */
537 case ISO15693_PROP_PIPE_OPEN:
538 {
539 p_pipe_info = ((phHciNfc_ISO15693_Info_t *)
540 psHciContext->p_iso_15693_info)->ps_15693_pipe_info;
541 if(NULL == p_pipe_info )
542 {
543 status = PHNFCSTVAL(CID_NFC_HCI,
544 NFCSTATUS_INVALID_HCI_SEQUENCE);
545 }
546 else
547 {
548 status = phHciNfc_Open_Pipe( psHciContext,
549 pHwRef, p_pipe_info );
550 if(status == NFCSTATUS_SUCCESS)
551 {
552 #ifdef ENABLE_P2P
553 p_reader_mgmt_info->rf_gate_next_seq =
554 NFCIP1_INITIATOR_PIPE_OPEN;
555 status = NFCSTATUS_PENDING;
556 /* end of #ifdef ENABLE_P2P */
557 #else
558 p_reader_mgmt_info->rf_gate_next_seq =
559 END_READER_SEQUENCE;
560 /* status = NFCSTATUS_PENDING; */
561 #endif /* #if !defined(ENABLE_P2P) */
562 }
563 }
564 break;
565 }
566
567 #endif
568
569 #ifdef ENABLE_P2P
570 /* NFC-IP1 Initiator pipe open sequence */
571 case NFCIP1_INITIATOR_PIPE_OPEN:
572 {
573 p_pipe_info =
574 ((phHciNfc_NfcIP_Info_t *)psHciContext->
575 p_nfcip_info)->p_init_pipe_info;
576 if(NULL == p_pipe_info )
577 {
578 status = PHNFCSTVAL(CID_NFC_HCI,
579 NFCSTATUS_INVALID_HCI_SEQUENCE);
580 }
581 else
582 {
583 status = phHciNfc_Open_Pipe( psHciContext,
584 pHwRef, p_pipe_info );
585 if(status == NFCSTATUS_SUCCESS)
586 {
587 p_reader_mgmt_info->rf_gate_next_seq =
588 NFCIP1_INITIATOR_MODE_CONFIG;
589 status = NFCSTATUS_PENDING;
590 }
591 }
592 break;
593 }
594 case NFCIP1_INITIATOR_MODE_CONFIG:
595 {
596 uint8_t mode = DEFAULT_NFCIP_INITIATOR_MODE_SUPPORT;
597 status = phHciNfc_NfcIP_SetMode( psHciContext, pHwRef,
598 NFCIP_INITIATOR, mode);
599 if(status == NFCSTATUS_PENDING )
600 {
601 p_reader_mgmt_info->rf_gate_next_seq =
602 NFCIP1_INITIATOR_PSL1_CONFIG;
603 /* status = NFCSTATUS_SUCCESS; */
604 }
605 break;
606 }
607 case NFCIP1_INITIATOR_PSL1_CONFIG:
608 {
609 uint8_t psl_config = NXP_NFCIP_PSL_BRS_DEFAULT;
610 status = phHciNfc_NfcIP_SetPSL1( psHciContext, pHwRef,
611 psl_config);
612 if(status == NFCSTATUS_PENDING )
613 {
614 p_reader_mgmt_info->rf_gate_next_seq =
615 END_READER_SEQUENCE;
616 status = NFCSTATUS_SUCCESS;
617 }
618 break;
619 }
620 #endif
621 default:
622 {
623 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
624 break;
625 }
626
627 }/* End of the Sequence Switch */
628
629 }/* End of the Reader Info Memory Check */
630
631 } /* End of Null Context Check */
632
633 return status;
634 }
635
636
637 /*!
638 * \brief Initiate the Discovery for the RF Reader .
639 *
640 * This function starts the Polling Loop and initiates the discovery
641 * of the Target.
642 *
643 */
644 static
645 NFCSTATUS
phHciNfc_ReaderMgmt_Initiate_Discovery(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t reader_pipe_id)646 phHciNfc_ReaderMgmt_Initiate_Discovery(
647 phHciNfc_sContext_t *psHciContext,
648 void *pHwRef,
649 uint8_t reader_pipe_id
650 )
651 {
652 NFCSTATUS status = NFCSTATUS_SUCCESS;
653
654 if( ( NULL == psHciContext )
655 || ( NULL == pHwRef )
656 || ( HCI_UNKNOWN_PIPE_ID == reader_pipe_id)
657 )
658 {
659 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
660 }
661 else
662 {
663
664 status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef,
665 reader_pipe_id,(uint8_t) EVT_READER_REQUESTED );
666 status = ( (status == NFCSTATUS_PENDING)?
667 NFCSTATUS_SUCCESS : status);
668 }
669 return status;
670 }
671
672
673 /*!
674 * \brief End the Discovery of the RF Reader .
675 *
676 * This function stops the Polling Loop and ends the discovery
677 * of the Target.
678 *
679 */
680 static
681 NFCSTATUS
phHciNfc_ReaderMgmt_End_Discovery(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t reader_pipe_id)682 phHciNfc_ReaderMgmt_End_Discovery(
683 phHciNfc_sContext_t *psHciContext,
684 void *pHwRef,
685 uint8_t reader_pipe_id
686 )
687 {
688 NFCSTATUS status = NFCSTATUS_SUCCESS;
689
690 if( ( NULL == psHciContext )
691 || ( NULL == pHwRef )
692 || ( HCI_UNKNOWN_PIPE_ID == reader_pipe_id)
693 )
694 {
695 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
696 }
697 else
698 {
699
700 status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef,
701 reader_pipe_id,(uint8_t) EVT_END_OPERATION );
702 status = ( (status == NFCSTATUS_PENDING)?
703 NFCSTATUS_SUCCESS : status);
704 }
705 return status;
706 }
707
708
709 /*!
710 * \brief Enable the Discovery of RF Reader Managment Gate.
711 *
712 * This function Enable the discovery of the RF Reader Management
713 * gate.
714 *
715 */
716
717
718 NFCSTATUS
phHciNfc_ReaderMgmt_Enable_Discovery(phHciNfc_sContext_t * psHciContext,void * pHwRef)719 phHciNfc_ReaderMgmt_Enable_Discovery(
720 phHciNfc_sContext_t *psHciContext,
721 void *pHwRef
722 )
723 {
724 NFCSTATUS status = NFCSTATUS_SUCCESS;
725 phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL;
726 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
727 /* phHal_sADD_Cfg_t *p_poll_config = (phHal_sADD_Cfg_t * )
728 psHciContext->p_config_params; */
729 PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info);
730 if( NULL != psHciContext->p_reader_mgmt_info )
731 {
732 uint8_t rdr_enable = FALSE;
733 p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
734 psHciContext->p_reader_mgmt_info ;
735 #ifdef TYPE_B
736 if ( (NULL != psHciContext->p_reader_b_info )
737 /* && (FALSE == rdr_enable) */
738 )
739 {
740 /* Get the Reader B Pipe ID */
741 status = phHciNfc_ReaderB_Get_PipeID
742 (psHciContext, &reader_pipe_id);
743
744 if( NFCSTATUS_SUCCESS == status )
745 {
746 rdr_enable = (uint8_t)TRUE;
747 /* rdr_enable = (uint8_t)
748 p_poll_config->PollDevInfo.PollCfgInfo.EnableIso14443B; */
749 status = phHciNfc_ReaderB_Update_Info(psHciContext,
750 HCI_RDR_ENABLE_TYPE, &rdr_enable);
751 }
752 }
753 #endif
754 #ifdef TYPE_FELICA
755 if ( (NULL != psHciContext->p_felica_info )
756 /* && (FALSE == rdr_enable) */
757 )
758 {
759 /* Get the Reader F Pipe ID */
760 status = phHciNfc_Felica_Get_PipeID
761 (psHciContext, &reader_pipe_id);
762
763 if( NFCSTATUS_SUCCESS == status )
764 {
765 rdr_enable = (uint8_t)TRUE;
766 /* rdr_enable = (uint8_t)
767 ( p_poll_config->PollDevInfo.PollCfgInfo.EnableFelica212
768 || p_poll_config->PollDevInfo.PollCfgInfo.EnableFelica424 ); */
769 status = phHciNfc_Felica_Update_Info(psHciContext,
770 HCI_RDR_ENABLE_TYPE, &rdr_enable);
771 }
772 }
773 #endif
774 #ifdef TYPE_JEWEL
775 if ( (NULL != psHciContext->p_jewel_info )
776 /* && (FALSE == rdr_enable) */
777 )
778 {
779 /* Get the Reader F Pipe ID */
780 status = phHciNfc_Jewel_Get_PipeID
781 (psHciContext, &reader_pipe_id);
782
783 if( NFCSTATUS_SUCCESS == status )
784 {
785 rdr_enable = (uint8_t)TRUE;
786 status = phHciNfc_Jewel_Update_Info(psHciContext,
787 HCI_RDR_ENABLE_TYPE, &rdr_enable);
788 }
789 }
790 #endif /* #ifdef TYPE_JEWEL */
791 #if defined(TYPE_ISO15693)
792 if ( (NULL != psHciContext->p_iso_15693_info )
793 /* && (FALSE == rdr_enable) */
794 )
795 {
796 /* Get the Reader F Pipe ID */
797 status = phHciNfc_ISO15693_Get_PipeID
798 (psHciContext, &reader_pipe_id);
799
800 if( NFCSTATUS_SUCCESS == status )
801 {
802 rdr_enable = (uint8_t)TRUE;
803 status = phHciNfc_ISO15693_Update_Info(psHciContext,
804 HCI_RDR_ENABLE_TYPE, &rdr_enable);
805 }
806 }
807
808 /* end of #elif defined(TYPE_ISO15693) */
809 #endif
810
811 if(NULL != psHciContext->p_reader_a_info)
812 {
813 /* Get the Reader A Pipe ID */
814 status = phHciNfc_ReaderA_Get_PipeID
815 (psHciContext, &reader_pipe_id);
816
817 if( NFCSTATUS_SUCCESS == status )
818 {
819 rdr_enable = (uint8_t)TRUE;
820 status = phHciNfc_ReaderA_Update_Info(psHciContext,
821 HCI_RDR_ENABLE_TYPE, &rdr_enable);
822 }
823
824 }
825 if( ( NFCSTATUS_SUCCESS == status )
826 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
827 )
828 {
829 status = phHciNfc_ReaderMgmt_Initiate_Discovery( psHciContext,
830 pHwRef, reader_pipe_id);
831 }
832
833 }/* End of the Reader Info Memory Check */
834
835 return status;
836 }
837
838 /*!
839 * \brief Disable the Discovery of RF Reader Managment Gate.
840 *
841 * This function Disable the discovery of the RF Reader Management
842 * gate.
843 *
844 */
845
846 NFCSTATUS
phHciNfc_ReaderMgmt_Disable_Discovery(phHciNfc_sContext_t * psHciContext,void * pHwRef)847 phHciNfc_ReaderMgmt_Disable_Discovery(
848 phHciNfc_sContext_t *psHciContext,
849 void *pHwRef
850 )
851 {
852 NFCSTATUS status = NFCSTATUS_FAILED;
853 phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL;
854 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
855 /* phHal_sADD_Cfg_t *p_poll_config = (phHal_sADD_Cfg_t * )
856 psHciContext->p_config_params; */
857 PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info);
858 if( NULL != psHciContext->p_reader_mgmt_info )
859 {
860 p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
861 psHciContext->p_reader_mgmt_info ;
862 if(NULL != psHciContext->p_reader_a_info)
863 {
864 /* Get the Reader A Pipe ID */
865 status = phHciNfc_ReaderA_Get_PipeID
866 (psHciContext, &reader_pipe_id);
867 #if 0
868 if( NFCSTATUS_SUCCESS == status )
869 {
870 uint8_t rdr_enable = (uint8_t) FALSE;
871 status = phHciNfc_ReaderA_Update_Info(psHciContext,
872 HCI_RDR_ENABLE_TYPE, &rdr_enable);
873 }
874 #endif
875
876 }
877 #ifdef TYPE_B
878 else if((NULL != psHciContext->p_reader_b_info )
879 /* && (NFCSTATUS_SUCCESS != status) */
880 )
881 {
882 /* Get the Reader B Pipe ID */
883 status = phHciNfc_ReaderB_Get_PipeID
884 (psHciContext, &reader_pipe_id);
885 }
886 #endif
887 #ifdef TYPE_FELICA
888 else if((NULL != psHciContext->p_felica_info )
889 /* && (NFCSTATUS_SUCCESS != status) */
890 )
891 {
892 /* Get the Reader B Pipe ID */
893 status = phHciNfc_Felica_Get_PipeID
894 (psHciContext, &reader_pipe_id);
895 }
896 #endif
897 #ifdef TYPE_JEWEL
898 else if((NULL != psHciContext->p_jewel_info )
899 /* && (NFCSTATUS_SUCCESS != status) */
900 )
901 {
902 /* Get the Reader B Pipe ID */
903 status = phHciNfc_Jewel_Get_PipeID
904 (psHciContext, &reader_pipe_id);
905 }
906 #endif /* #ifdef TYPE_JEWEL */
907 #ifdef TYPE_ISO15693
908 else if((NULL != psHciContext->p_iso_15693_info )
909 /* && (NFCSTATUS_SUCCESS != status) */
910 )
911 {
912 /* Get the Reader B Pipe ID */
913 status = phHciNfc_ISO15693_Get_PipeID
914 (psHciContext, &reader_pipe_id);
915 }
916 #endif /* #ifdef TYPE_ISO15693 */
917
918 else
919 {
920 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED);
921 }
922
923 if( (NFCSTATUS_SUCCESS == status)
924 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
925 )
926 {
927 status = phHciNfc_ReaderMgmt_End_Discovery( psHciContext,
928 pHwRef, reader_pipe_id);
929 }
930
931 }/* End of the Reader Info Memory Check */
932
933 return status;
934 }
935
936
937
938
939 /*!
940 * \brief Updates the Sequence of RF Reader Managment Gate.
941 *
942 * This function Resets/Updates the sequence of the RF Reader Management
943 * gate.
944 *
945 */
946
947 NFCSTATUS
phHciNfc_ReaderMgmt_Info_Sequence(phHciNfc_sContext_t * psHciContext,void * pHwRef)948 phHciNfc_ReaderMgmt_Info_Sequence(
949 phHciNfc_sContext_t *psHciContext,
950 void *pHwRef
951 )
952 {
953 #if defined(NXP_NFCIP_ACTIVATE_DELAY)
954 static uint8_t nfc_atr_retry = 0;
955 #endif
956 NFCSTATUS status = NFCSTATUS_SUCCESS;
957 phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL;
958 #if 0
959 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
960 phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
961 #endif
962
963
964 PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info);
965 if( NULL == psHciContext )
966 {
967 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
968 }
969 else
970 {
971 if( NULL != psHciContext->p_reader_mgmt_info )
972 {
973 p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
974 psHciContext->p_reader_mgmt_info ;
975 switch( psHciContext->host_rf_type )
976 {
977
978 case phHal_eISO14443_A_PCD:
979 {
980 /* If the Target Info is updated then the Target
981 * is connected.
982 */
983 if(NULL == psHciContext->p_target_info)
984 {
985 #if defined(NXP_NFCIP_ACTIVATE_DELAY)
986 nfc_atr_retry = 0;
987 #endif
988 status = phHciNfc_ReaderA_Info_Sequence(
989 psHciContext, pHwRef );
990 }
991 else
992 {
993 status = phHciNfc_ReaderA_App_Data(
994 psHciContext, pHwRef );
995 status = ((NFCSTATUS_PENDING == status )?
996 NFCSTATUS_SUCCESS : status);
997 }
998 break;
999 }
1000 #ifdef ENABLE_P2P
1001 case phHal_eNfcIP1_Initiator:
1002 {
1003 /* If the Target Info is updated then the Target
1004 * is connected.
1005 */
1006 #ifdef NFCIP_CHECK
1007 if(NULL == psHciContext->p_target_info)
1008 #endif
1009 {
1010 status = phHciNfc_NfcIP_Info_Sequence(
1011 psHciContext, pHwRef
1012 #ifdef NOTIFY_REQD
1013 ,(NULL == psHciContext->p_target_info)
1014 #endif /* #ifdef NOTIFY_REQD */
1015 );
1016 }
1017 #ifdef NFCIP_CHECK
1018 else
1019 {
1020 status = phHciNfc_NfcIP_GetATRInfo(
1021 psHciContext, pHwRef, NFCIP_INITIATOR );
1022 #if defined(NXP_NFCIP_ACTIVATE_DELAY)
1023 if (
1024 (NFCSTATUS_PENDING == status)
1025 && ( NFCIP_ACTIVATE_DELAY <= nfc_atr_retry)
1026 )
1027 {
1028 nfc_atr_retry = 0;
1029 status = NFCSTATUS_SUCCESS;
1030 }
1031 else
1032 {
1033 nfc_atr_retry++;
1034 }
1035 #else
1036 status = ((NFCSTATUS_PENDING == status )?
1037 NFCSTATUS_SUCCESS : status);
1038 #endif
1039 }
1040 #endif
1041 break;
1042 }
1043 #endif
1044 #ifdef TYPE_B
1045 case phHal_eISO14443_B_PCD:
1046 {
1047 if(NULL == psHciContext->p_target_info)
1048 {
1049 status = phHciNfc_ReaderB_Info_Sequence(
1050 psHciContext, pHwRef );
1051 }
1052 break;
1053 }
1054 #endif /* #ifdef TYPE_B */
1055 #ifdef TYPE_FELICA
1056 case phHal_eFelica_PCD:
1057 {
1058 if(NULL == psHciContext->p_target_info)
1059 {
1060 #if defined(NXP_NFCIP_ACTIVATE_DELAY)
1061 nfc_atr_retry = 0;
1062 #endif
1063 status = phHciNfc_Felica_Info_Sequence(
1064 psHciContext, pHwRef );
1065 }
1066 break;
1067 }
1068 #endif /* #ifdef TYPE_FELICA */
1069 #ifdef TYPE_JEWEL
1070 case phHal_eJewel_PCD:
1071 {
1072 if(NULL == psHciContext->p_target_info)
1073 {
1074 status = phHciNfc_Jewel_Info_Sequence(
1075 psHciContext, pHwRef );
1076 }
1077 break;
1078 }
1079 #endif /* #ifdef TYPE_JEWEL */
1080 #if defined(TYPE_ISO15693)
1081 case phHal_eISO15693_PCD:
1082 {
1083 if(NULL == psHciContext->p_target_info)
1084 {
1085 status = phHciNfc_ISO15693_Info_Sequence(
1086 psHciContext, pHwRef );
1087 }
1088 break;
1089 }
1090 #endif
1091 default:
1092 {
1093 break;
1094 }
1095 }
1096
1097 }/* End of the Reader Info Memory Check */
1098
1099 } /* End of Null Context Check */
1100
1101 return status;
1102
1103 }
1104
1105
1106 /*!
1107 * \brief Connects the the selected tag via RF Reader Gates.
1108 *
1109 * This function connects the selected tags via RF Reader Gate.
1110 * This function uses the RF Reader gate based on the type of the
1111 * tag specified.
1112 */
1113
1114
1115 NFCSTATUS
phHciNfc_ReaderMgmt_Select(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHal_eRemDevType_t target_type)1116 phHciNfc_ReaderMgmt_Select(
1117 phHciNfc_sContext_t *psHciContext,
1118 void *pHwRef,
1119 phHal_eRemDevType_t target_type
1120 )
1121 {
1122 NFCSTATUS status = NFCSTATUS_SUCCESS;
1123 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
1124
1125 if( (NULL == psHciContext) || (NULL == pHwRef) )
1126 {
1127 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1128 }
1129 else
1130 {
1131 switch (target_type)
1132 {
1133 case phHal_eMifare_PICC:
1134 case phHal_eISO14443_3A_PICC:
1135 {
1136 /* Get the Reader A Pipe ID */
1137 status = phHciNfc_ReaderA_Get_PipeID
1138 (psHciContext, &reader_pipe_id);
1139
1140 if( (NFCSTATUS_SUCCESS == status)
1141 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1142 )
1143 {
1144 status = phHciNfc_ReaderMgmt_Reactivate(
1145 psHciContext, pHwRef, target_type );
1146 }
1147 break;
1148 }
1149 case phHal_eISO14443_A_PICC:
1150 case phHal_eISO14443_4A_PICC:
1151 {
1152 #ifdef ENABLE_AUTO_ACTIVATE
1153 /* Get the Reader A Pipe ID */
1154 status = phHciNfc_ReaderA_Get_PipeID
1155 (psHciContext, &reader_pipe_id);
1156
1157 if( (NFCSTATUS_SUCCESS == status)
1158 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1159 )
1160 {
1161 status = phHciNfc_Send_RFReader_Command (psHciContext,
1162 pHwRef, reader_pipe_id, NXP_WR_PRESCHECK );
1163 }
1164 #else
1165 status = phHciNfc_ReaderA_Cont_Activate(
1166 psHciContext, pHwRef);
1167 #endif /* #ifdef ENABLE_AUTO_ACTIVATE */
1168 break;
1169 }
1170 #ifdef TYPE_B
1171 case phHal_eISO14443_B_PICC:
1172 case phHal_eISO14443_4B_PICC:
1173 {
1174 /* Get the Reader B Pipe ID */
1175 status = phHciNfc_ReaderB_Get_PipeID
1176 (psHciContext, &reader_pipe_id);
1177
1178 if( (NFCSTATUS_SUCCESS == status)
1179 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1180 )
1181 {
1182 status = phHciNfc_Send_RFReader_Command (psHciContext,
1183 pHwRef, reader_pipe_id, NXP_WR_PRESCHECK );
1184 /* status = phHciNfc_ReaderA_Set_DataRateMax(
1185 psHciContext, pHwRef,
1186 DATA_RATE_MAX_DEFAULT_VALUE ); */
1187 /* status = phHciNfc_ReaderMgmt_Reactivate(
1188 psHciContext, pHwRef, target_type ); */
1189 }
1190 break;
1191 }
1192 #endif /* #ifdef TYPE_B */
1193 #ifdef TYPE_FELICA
1194 case phHal_eFelica_PICC:
1195 {
1196 status = phHciNfc_Felica_Get_PipeID
1197 (psHciContext, &reader_pipe_id);
1198
1199 if( (NFCSTATUS_SUCCESS == status)
1200 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1201 )
1202 {
1203 /* Get the Reader Felica Pipe ID */
1204 /* status = phHciNfc_ReaderA_Set_DataRateMax(
1205 psHciContext, pHwRef,
1206 DATA_RATE_MAX_DEFAULT_VALUE ); */
1207 status = phHciNfc_ReaderMgmt_Reactivate(
1208 psHciContext, pHwRef, target_type );
1209 }
1210 break;
1211 }
1212 #endif /* #ifdef TYPE_FELICA */
1213 #ifdef TYPE_JEWEL
1214 case phHal_eJewel_PICC:
1215 {
1216 /* Get the Reader jewel Pipe ID */
1217 status = phHciNfc_Jewel_Get_PipeID
1218 (psHciContext, &reader_pipe_id);
1219
1220 if( (NFCSTATUS_SUCCESS == status)
1221 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1222 )
1223 {
1224 status = phHciNfc_Jewel_GetRID(
1225 psHciContext, pHwRef);
1226 }
1227 break;
1228 }
1229 #endif /* #ifdef TYPE_JEWEL */
1230 #ifdef TYPE_ISO15693
1231 case phHal_eISO15693_PICC:
1232 {
1233 /* Get the Reader ISO 15693 Pipe ID */
1234 status = phHciNfc_ISO15693_Get_PipeID
1235 (psHciContext, &reader_pipe_id);
1236
1237 if( (NFCSTATUS_SUCCESS == status)
1238 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1239 )
1240 {
1241 /* TODO */
1242 status = phHciNfc_ReaderA_Set_DataRateMax(
1243 psHciContext, pHwRef,
1244 DATA_RATE_MAX_DEFAULT_VALUE );
1245 }
1246 break;
1247 }
1248 #endif /* #ifdef TYPE_ISO15693 */
1249 #ifdef ENABLE_P2P
1250 case phHal_eNfcIP1_Target:
1251 {
1252 if ( (phHal_eISO14443_A_PCD ==
1253 psHciContext->host_rf_type )
1254 || (phHal_eFelica_PCD ==
1255 psHciContext->host_rf_type )
1256 )
1257 {
1258 status = phHciNfc_Initiator_Cont_Activate(
1259 psHciContext, pHwRef);
1260 }
1261 else
1262 {
1263 status = phHciNfc_NfcIP_Presence_Check (psHciContext, pHwRef);
1264 }
1265 break;
1266 }
1267 #endif
1268 #if 0
1269 case phHal_eNfcIP1_Initiator:
1270 {
1271
1272 break;
1273 }
1274 #endif
1275 default:
1276 {
1277 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1278 break;
1279 }
1280
1281 } /* End of the tag_type Switch */
1282 }
1283
1284 return status;
1285 }
1286
1287 NFCSTATUS
phHciNfc_ReaderMgmt_UICC_Dispatch(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHal_eRemDevType_t target_type)1288 phHciNfc_ReaderMgmt_UICC_Dispatch(
1289 phHciNfc_sContext_t *psHciContext,
1290 void *pHwRef,
1291 phHal_eRemDevType_t target_type
1292 )
1293 {
1294 NFCSTATUS status = NFCSTATUS_SUCCESS;
1295 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
1296 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
1297
1298
1299 if( (NULL == psHciContext) || (NULL == pHwRef) )
1300 {
1301 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1302 }
1303 else if (NULL == psHciContext->p_target_info)
1304 {
1305 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
1306 }
1307 else
1308 {
1309 switch (target_type)
1310 {
1311 case phHal_eISO14443_A_PICC:
1312 case phHal_eISO14443_4A_PICC:
1313 {
1314 /* Get the Reader A Pipe ID */
1315 status = phHciNfc_ReaderA_Get_PipeID(
1316 psHciContext, &reader_pipe_id);
1317 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1318 p_pipe_info->param_info = &psHciContext->p_target_info->
1319 RemoteDevInfo.Iso14443A_Info.Uid;
1320 p_pipe_info->param_length = psHciContext->p_target_info->
1321 RemoteDevInfo.Iso14443A_Info.UidLength;
1322
1323 break;
1324 }
1325 #ifdef TYPE_B
1326 case phHal_eISO14443_B_PICC:
1327 case phHal_eISO14443_4B_PICC:
1328 {
1329 /* Get the Reader B Pipe ID */
1330 status = phHciNfc_ReaderB_Get_PipeID
1331 (psHciContext, &reader_pipe_id);
1332
1333 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1334 p_pipe_info->param_info = &psHciContext->p_target_info->
1335 RemoteDevInfo.Iso14443B_Info.AtqB.AtqResInfo.Pupi;
1336 p_pipe_info->param_length = PHHAL_PUPI_LENGTH;
1337 break;
1338 }
1339 #endif /* #ifdef TYPE_B */
1340 case phHal_eMifare_PICC:
1341 case phHal_eISO14443_3A_PICC:
1342 default:
1343 {
1344 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1345 break;
1346 }
1347
1348 } /* End of the tag_type Switch */
1349 }
1350 if( (NFCSTATUS_SUCCESS == status)
1351 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1352 )
1353 {
1354 status = phHciNfc_Send_RFReader_Command (psHciContext,
1355 pHwRef, reader_pipe_id, NXP_WR_DISPATCH_TO_UICC );
1356 }
1357
1358 return status;
1359 }
1360
1361
1362 NFCSTATUS
phHciNfc_ReaderMgmt_Reactivate(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHal_eRemDevType_t target_type)1363 phHciNfc_ReaderMgmt_Reactivate(
1364 phHciNfc_sContext_t *psHciContext,
1365 void *pHwRef,
1366 phHal_eRemDevType_t target_type
1367 )
1368 {
1369 NFCSTATUS status = NFCSTATUS_SUCCESS;
1370 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
1371 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
1372
1373
1374 if( (NULL == psHciContext) || (NULL == pHwRef) )
1375 {
1376 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1377 }
1378 else if (NULL == psHciContext->p_target_info)
1379 {
1380 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
1381 }
1382 else
1383 {
1384 switch (target_type)
1385 {
1386 case phHal_eISO14443_A_PICC:
1387 case phHal_eMifare_PICC:
1388 case phHal_eISO14443_4A_PICC:
1389 case phHal_eISO14443_3A_PICC:
1390 {
1391 /* Get the Reader A Pipe ID */
1392 status = phHciNfc_ReaderA_Get_PipeID(
1393 psHciContext, &reader_pipe_id);
1394 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1395 p_pipe_info->param_info = &psHciContext->p_target_info->
1396 RemoteDevInfo.Iso14443A_Info.Uid;
1397 p_pipe_info->param_length = psHciContext->p_target_info->
1398 RemoteDevInfo.Iso14443A_Info.UidLength;
1399
1400 break;
1401 }
1402 #ifdef TYPE_B
1403 case phHal_eISO14443_B_PICC:
1404 case phHal_eISO14443_4B_PICC:
1405 {
1406 /* Get the Reader B Pipe ID */
1407 status = phHciNfc_ReaderB_Get_PipeID
1408 (psHciContext, &reader_pipe_id);
1409
1410 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1411 p_pipe_info->param_info = &psHciContext->p_target_info->
1412 RemoteDevInfo.Iso14443B_Info.AtqB.AtqResInfo.Pupi;
1413 p_pipe_info->param_length = PHHAL_PUPI_LENGTH;
1414 break;
1415 }
1416 #endif /* #ifdef TYPE_B */
1417 #ifdef TYPE_FELICA
1418 case phHal_eFelica_PICC:
1419 {
1420 /* Get the Felica Reader Pipe ID */
1421 status = phHciNfc_Felica_Get_PipeID
1422 (psHciContext, &reader_pipe_id);
1423
1424 if( (NFCSTATUS_SUCCESS == status)
1425 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1426 )
1427 {
1428 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1429 p_pipe_info->param_info = &psHciContext->p_target_info->
1430 RemoteDevInfo.Felica_Info.IDm;
1431 p_pipe_info->param_length = PHHAL_FEL_ID_LEN;
1432 }
1433 break;
1434 }
1435 #endif /* #ifdef TYPE_FELICA */
1436 #ifdef ENABLE_P2P
1437 case phHal_eNfcIP1_Target:
1438 {
1439 /* Get the Initiator Pipe ID */
1440 status = phHciNfc_Initiator_Get_PipeID(
1441 psHciContext, &reader_pipe_id);
1442 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1443 p_pipe_info->param_info = &psHciContext->p_target_info->
1444 RemoteDevInfo.NfcIP_Info.NFCID;
1445 p_pipe_info->param_length = psHciContext->p_target_info->
1446 RemoteDevInfo.NfcIP_Info.NFCID_Length;
1447 break;
1448 }
1449 case phHal_eNfcIP1_Initiator:
1450 {
1451 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1452 break;
1453 }
1454 #endif /* #ifdef ENABLE_P2P */
1455 default:
1456 {
1457 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1458 break;
1459 }
1460
1461 } /* End of the tag_type Switch */
1462 }
1463 if( (NFCSTATUS_SUCCESS == status)
1464 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1465 )
1466 {
1467 status = phHciNfc_Send_RFReader_Command (psHciContext,
1468 pHwRef, reader_pipe_id, NXP_WR_ACTIVATE_ID );
1469 }
1470
1471 return status;
1472 }
1473
1474
1475 /*!
1476 * \brief Activates the next Remote Target in the field.
1477 *
1478 * This function selects and activates the next tag present in the field.
1479 */
1480
1481
1482 NFCSTATUS
phHciNfc_ReaderMgmt_Activate_Next(phHciNfc_sContext_t * psHciContext,void * pHwRef)1483 phHciNfc_ReaderMgmt_Activate_Next(
1484 phHciNfc_sContext_t *psHciContext,
1485 void *pHwRef
1486 )
1487 {
1488 NFCSTATUS status = NFCSTATUS_SUCCESS;
1489 /* phHciNfc_Pipe_Info_t *p_pipe_info = NULL; */
1490 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
1491
1492 if( (NULL == psHciContext) || (NULL == pHwRef) )
1493 {
1494 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1495 }
1496 else
1497 {
1498 switch ( psHciContext->host_rf_type )
1499 {
1500 case phHal_eISO14443_A_PCD:
1501 {
1502 /* Get the Reader A Pipe ID */
1503 status = phHciNfc_ReaderA_Get_PipeID
1504 (psHciContext, &reader_pipe_id);
1505
1506 break;
1507 }
1508 #ifdef TYPE_B
1509 case phHal_eISO14443_B_PCD:
1510 {
1511 /* Get the Reader B Pipe ID */
1512 status = phHciNfc_ReaderB_Get_PipeID
1513 (psHciContext, &reader_pipe_id);
1514
1515 break;
1516 }
1517 #endif /* #ifdef TYPE_B */
1518 #ifdef TYPE_FELICA
1519 case phHal_eFelica_PCD:
1520 {
1521 /* Get the Felica Reader Pipe ID */
1522 status = phHciNfc_Felica_Get_PipeID
1523 (psHciContext, &reader_pipe_id);
1524
1525 break;
1526 }
1527 #endif /* #ifdef TYPE_FELICA */
1528 #ifdef TYPE_ISO15693
1529 case phHal_eISO15693_PCD:
1530 {
1531 /* Get the ISO 15693 Reader Pipe ID */
1532 status = phHciNfc_ISO15693_Get_PipeID
1533 (psHciContext, &reader_pipe_id);
1534
1535 break;
1536 }
1537 #endif /* #ifdef TYPE_ISO15693 */
1538 default:
1539 {
1540 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1541 break;
1542 }
1543
1544 } /* End of the reader_type Switch */
1545 if( (NFCSTATUS_SUCCESS == status)
1546 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1547 )
1548 {
1549 status = phHciNfc_Send_RFReader_Command (psHciContext,
1550 pHwRef, reader_pipe_id, NXP_WR_ACTIVATE_NEXT );
1551 }
1552
1553 }
1554
1555 return status;
1556
1557 }
1558
1559 /*!
1560 * \brief Checks the presence of the Remote Target in the field.
1561 *
1562 * This function checks the presence of the tag present in the field.
1563 */
1564
1565
1566 NFCSTATUS
phHciNfc_ReaderMgmt_Presence_Check(phHciNfc_sContext_t * psHciContext,void * pHwRef)1567 phHciNfc_ReaderMgmt_Presence_Check(
1568 phHciNfc_sContext_t *psHciContext,
1569 void *pHwRef
1570 )
1571 {
1572 NFCSTATUS status = NFCSTATUS_SUCCESS;
1573 /* phHciNfc_Pipe_Info_t *p_pipe_info = NULL; */
1574 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
1575 phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
1576
1577 if( (NULL == psHciContext) || (NULL == pHwRef) )
1578 {
1579 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1580 }
1581 else
1582 {
1583 target_type = psHciContext->p_target_info->RemDevType;
1584 switch (target_type)
1585 {
1586 case phHal_eMifare_PICC:
1587 case phHal_eISO14443_3A_PICC:
1588 {
1589 /* Get the Reader A Pipe ID */
1590 status = phHciNfc_ReaderA_Get_PipeID
1591 (psHciContext, &reader_pipe_id);
1592
1593 if( (NFCSTATUS_SUCCESS == status)
1594 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1595 )
1596 {
1597 status = phHciNfc_ReaderMgmt_Reactivate(
1598 psHciContext, pHwRef, target_type );
1599 }
1600 break;
1601 }
1602 case phHal_eISO14443_A_PICC:
1603 case phHal_eISO14443_4A_PICC:
1604 {
1605 /* Get the Reader A Pipe ID */
1606 status = phHciNfc_ReaderA_Get_PipeID
1607 (psHciContext, &reader_pipe_id);
1608
1609 if( (NFCSTATUS_SUCCESS == status)
1610 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1611 )
1612 {
1613 status = phHciNfc_Send_RFReader_Command (psHciContext,
1614 pHwRef, reader_pipe_id, NXP_WR_PRESCHECK );
1615 }
1616 break;
1617 }
1618 #ifdef ENABLE_P2P
1619 case phHal_eNfcIP1_Target:
1620 {
1621 status = phHciNfc_NfcIP_Presence_Check (psHciContext, pHwRef);
1622 break;
1623 }
1624 #endif
1625 #ifdef TYPE_B
1626 case phHal_eISO14443_B_PICC:
1627 case phHal_eISO14443_4B_PICC:
1628 {
1629 /* Get the Reader B Pipe ID */
1630 status = phHciNfc_ReaderB_Get_PipeID
1631 (psHciContext, &reader_pipe_id);
1632
1633 if( (NFCSTATUS_SUCCESS == status)
1634 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1635 )
1636 {
1637 status = phHciNfc_Send_RFReader_Command (psHciContext,
1638 pHwRef, reader_pipe_id, NXP_WR_PRESCHECK );
1639 }
1640 break;
1641 }
1642 #endif /* #ifdef TYPE_B */
1643 #ifdef TYPE_FELICA
1644 case phHal_eFelica_PICC:
1645 {
1646 /* Get the Felica Reader Pipe ID */
1647 status = phHciNfc_Felica_Get_PipeID
1648 (psHciContext, &reader_pipe_id);
1649
1650 if( (NFCSTATUS_SUCCESS == status)
1651 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1652 )
1653 {
1654 status = phHciNfc_Felica_Request_Mode(psHciContext, pHwRef);
1655 }
1656 break;
1657 }
1658 #endif /* #ifdef TYPE_FELICA */
1659 #ifdef TYPE_JEWEL
1660 case phHal_eJewel_PICC:
1661 {
1662 /* Get the Jewel Reader Pipe ID */
1663 status = phHciNfc_Jewel_Get_PipeID
1664 (psHciContext, &reader_pipe_id);
1665
1666 if( (NFCSTATUS_SUCCESS == status)
1667 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1668 )
1669 {
1670 /* status = PHNFCSTVAL(CID_NFC_HCI,
1671 NFCSTATUS_FEATURE_NOT_SUPPORTED); */
1672 status = phHciNfc_Jewel_GetRID(
1673 psHciContext, pHwRef);
1674 }
1675 break;
1676 }
1677 #endif /* #ifdef TYPE_JEWEL */
1678 #ifdef TYPE_ISO15693
1679 case phHal_eISO15693_PICC:
1680 {
1681 /* Get the Reader ISO 15693 Pipe ID */
1682 status = phHciNfc_ISO15693_Get_PipeID
1683 (psHciContext, &reader_pipe_id);
1684
1685 if( (NFCSTATUS_SUCCESS == status)
1686 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1687 )
1688 {
1689 uint8_t cmd[11];
1690 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
1691 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1692 p_pipe_info->param_info = &cmd;
1693 p_pipe_info->param_length = 11;
1694 // masked inventory command:
1695 // set #slots to 1 to use mask without padding,
1696 // need to set inventory flag to enable setting #slots
1697 cmd[0] = 0x04 | 0x20; // FLAG_INVENTORY | FLAG_SLOTS
1698 cmd[1] = 0x01; // CMD_INVENTORY
1699 cmd[2] = 64; // mask bit-length
1700 memcpy(cmd + 3, &(psHciContext->p_target_info->RemoteDevInfo.Iso15693_Info.Uid), 8);
1701 status = phHciNfc_Send_ISO15693_Command(
1702 psHciContext, pHwRef
1703 ,reader_pipe_id, NXP_ISO15693_CMD );
1704
1705 }
1706 break;
1707 }
1708 #endif /* #ifdef TYPE_ISO15693 */
1709 default:
1710 {
1711 status = PHNFCSTVAL(CID_NFC_HCI,
1712 NFCSTATUS_FEATURE_NOT_SUPPORTED);
1713 break;
1714 }
1715
1716 } /* End of the tag_type Switch */
1717 }
1718
1719 return status;
1720
1721 }
1722
1723
1724 /*!
1725 * \brief Disconnects the the selected tag.
1726 *
1727 * This function disconnects the selected tags via RF Reader Gate.
1728 * This function uses the RF Reader gate based on the type of the
1729 * tag specified.
1730 */
1731
1732
1733 NFCSTATUS
phHciNfc_ReaderMgmt_Deselect(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHal_eRemDevType_t target_type,uint8_t re_poll)1734 phHciNfc_ReaderMgmt_Deselect(
1735 phHciNfc_sContext_t *psHciContext,
1736 void *pHwRef,
1737 phHal_eRemDevType_t target_type,
1738 uint8_t re_poll
1739 )
1740 {
1741 static uint8_t rls_param = FALSE;
1742 NFCSTATUS status = NFCSTATUS_SUCCESS;
1743 uint8_t reader_pipe_id =
1744 (uint8_t) HCI_UNKNOWN_PIPE_ID;
1745 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
1746
1747
1748
1749 if( (NULL == psHciContext)
1750 || (NULL == pHwRef)
1751 )
1752 {
1753 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1754 }
1755 else
1756 {
1757 rls_param = re_poll;
1758
1759 switch (target_type)
1760 {
1761 case phHal_eMifare_PICC:
1762 case phHal_eISO14443_A_PICC:
1763 case phHal_eISO14443_3A_PICC:
1764 case phHal_eISO14443_4A_PICC:
1765 {
1766 /* Get the Reader A Pipe ID */
1767 status = phHciNfc_ReaderA_Get_PipeID
1768 (psHciContext, &reader_pipe_id);
1769 break;
1770 }
1771 #ifdef TYPE_B
1772 case phHal_eISO14443_B_PICC:
1773 case phHal_eISO14443_4B_PICC:
1774 {
1775 /* Get the Reader B Pipe ID */
1776 status = phHciNfc_ReaderB_Get_PipeID
1777 (psHciContext, &reader_pipe_id);
1778
1779 break;
1780 }
1781 #endif /* #ifdef TYPE_B */
1782 #ifdef TYPE_FELICA
1783 case phHal_eFelica_PICC:
1784 {
1785 /* Get the Felica Pipe ID */
1786 status = phHciNfc_Felica_Get_PipeID
1787 (psHciContext, &reader_pipe_id);
1788
1789 break;
1790 }
1791 #endif /* #ifdef TYPE_FELICA */
1792 #ifdef TYPE_JEWEL
1793 case phHal_eJewel_PICC:
1794 {
1795 /* Get the Jewel Pipe ID */
1796 status = phHciNfc_Jewel_Get_PipeID
1797 (psHciContext, &reader_pipe_id);
1798
1799 break;
1800 }
1801 #endif /* #ifdef TYPE_JEWEL */
1802 #ifdef TYPE_ISO15693
1803 case phHal_eISO15693_PICC:
1804 {
1805 /* Get the ISO 15693 Pipe ID */
1806 status = phHciNfc_ISO15693_Get_PipeID
1807 (psHciContext, &reader_pipe_id);
1808
1809 break;
1810 }
1811 #endif /* #ifdef TYPE_ISO15693 */
1812 #ifdef ENABLE_P2P
1813 case phHal_eNfcIP1_Target:
1814 {
1815 /* Get the Reader A Pipe ID */
1816 status = phHciNfc_Initiator_Get_PipeID
1817 (psHciContext, &reader_pipe_id);
1818
1819 break;
1820 }
1821 #endif
1822 default:
1823 {
1824 status = PHNFCSTVAL(CID_NFC_HCI,
1825 NFCSTATUS_FEATURE_NOT_SUPPORTED);
1826 break;
1827 }
1828
1829 } /* End of the tag_type Switch */
1830 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1831 if( (NFCSTATUS_SUCCESS == status)
1832 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1833 && ( NULL != p_pipe_info ) )
1834 {
1835 if (TRUE == rls_param)
1836 {
1837 p_pipe_info->param_info = &rls_param;
1838 p_pipe_info->param_length = sizeof(rls_param);
1839 }
1840 status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef,
1841 reader_pipe_id,(uint8_t) NXP_EVT_RELEASE_TARGET );
1842 }
1843 }
1844
1845 return status;
1846 }
1847
1848
1849 /*!
1850 * \brief Exchanges the data to/from the selected tags via RF Reader Gates.
1851 *
1852 * This function Exchanges the data to/from the selected tags
1853 * via RF Reader Gates. This function uses the RF Reader gate based on the
1854 * type of the selected tag and the type of the Reader gate specified.
1855 */
1856
1857
1858 NFCSTATUS
phHciNfc_ReaderMgmt_Exchange_Data(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_XchgInfo_t * p_xchg_info)1859 phHciNfc_ReaderMgmt_Exchange_Data(
1860 phHciNfc_sContext_t *psHciContext,
1861 void *pHwRef,
1862 phHciNfc_XchgInfo_t *p_xchg_info
1863 )
1864 {
1865 NFCSTATUS status = NFCSTATUS_SUCCESS;
1866 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
1867 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
1868 phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
1869
1870 if( (NULL == psHciContext) || (NULL == pHwRef) )
1871 {
1872 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1873 }
1874 else if (NULL == psHciContext->p_xchg_info)
1875 {
1876 status = PHNFCSTVAL(CID_NFC_HCI,
1877 NFCSTATUS_INVALID_HCI_INFORMATION);
1878
1879 }
1880 else
1881 {
1882 switch (psHciContext->host_rf_type)
1883 {
1884 case phHal_eISO14443_A_PCD:
1885 {
1886 /* Get the Reader A Pipe ID */
1887 status = phHciNfc_ReaderA_Get_PipeID
1888 (psHciContext, &reader_pipe_id);
1889
1890 if( (NFCSTATUS_SUCCESS == status)
1891 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1892 )
1893 {
1894 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1895 p_pipe_info->param_info = p_xchg_info->tx_buffer;
1896 p_pipe_info->param_length = p_xchg_info->tx_length;
1897 target_type = psHciContext->p_target_info->RemDevType;
1898 switch (target_type)
1899 {
1900 case phHal_eMifare_PICC:
1901 case phHal_eISO14443_3A_PICC:
1902 {
1903 if ((uint8_t)phHal_eMifareRaw ==
1904 p_xchg_info->params.tag_info.cmd_type)
1905 {
1906 status = phHciNfc_Send_ReaderA_Command(
1907 psHciContext, pHwRef
1908 ,reader_pipe_id, NXP_MIFARE_RAW );
1909 }
1910 else
1911 {
1912 status = phHciNfc_Send_ReaderA_Command(
1913 psHciContext, pHwRef,
1914 reader_pipe_id, NXP_MIFARE_CMD );
1915 }
1916 break;
1917 }
1918 case phHal_eISO14443_A_PICC:
1919 case phHal_eISO14443_4A_PICC:
1920 {
1921 status = phHciNfc_Send_RFReader_Command(
1922 psHciContext, pHwRef,
1923 reader_pipe_id, WR_XCHGDATA );
1924 break;
1925 }
1926 default:
1927 {
1928 status = PHNFCSTVAL(CID_NFC_HCI,
1929 NFCSTATUS_FEATURE_NOT_SUPPORTED);
1930 break;
1931 }
1932 } /* End of the tag_type Switch */
1933 } /* End of Pipe ID Check */
1934 break;
1935 }
1936 #ifdef TYPE_B
1937 case phHal_eISO14443_B_PCD:
1938 {
1939 /* Get the Reader B Pipe ID */
1940 status = phHciNfc_ReaderB_Get_PipeID
1941 (psHciContext, &reader_pipe_id);
1942
1943 if( (NFCSTATUS_SUCCESS == status)
1944 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1945 )
1946 {
1947 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1948 p_pipe_info->param_info = p_xchg_info->tx_buffer;
1949 p_pipe_info->param_length = p_xchg_info->tx_length;
1950 status = phHciNfc_Send_RFReader_Command(
1951 psHciContext, pHwRef,
1952 reader_pipe_id, WR_XCHGDATA );
1953 }
1954 break;
1955 }
1956 #endif /* #ifdef TYPE_B */
1957 #ifdef TYPE_FELICA
1958 case phHal_eFelica_PCD:
1959 {
1960 /* Get the Felica Reader Pipe ID */
1961 status = phHciNfc_Felica_Get_PipeID
1962 (psHciContext, &reader_pipe_id);
1963
1964 if( (NFCSTATUS_SUCCESS == status)
1965 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1966 )
1967 {
1968 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
1969 p_pipe_info->param_info = p_xchg_info->tx_buffer;
1970 p_pipe_info->param_length = p_xchg_info->tx_length;
1971 if ((uint8_t)phHal_eFelica_Raw ==
1972 p_xchg_info->params.tag_info.cmd_type)
1973 {
1974 status = phHciNfc_Send_Felica_Command(
1975 psHciContext, pHwRef
1976 ,reader_pipe_id, NXP_FELICA_RAW );
1977 }
1978 else
1979 {
1980 status = phHciNfc_Send_Felica_Command(
1981 psHciContext, pHwRef,
1982 reader_pipe_id, NXP_FELICA_CMD );
1983 }
1984 }
1985 break;
1986 }
1987 #endif /* #ifdef TYPE_FELICA */
1988 #if defined(TYPE_ISO15693)
1989 case phHal_eISO15693_PCD:
1990 {
1991 /* Get the ISO15693 Reader Pipe ID */
1992 status = phHciNfc_ISO15693_Get_PipeID
1993 (psHciContext, &reader_pipe_id);
1994
1995 if( (NFCSTATUS_SUCCESS == status)
1996 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
1997 )
1998 {
1999 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
2000 p_pipe_info->param_info = p_xchg_info->tx_buffer;
2001 p_pipe_info->param_length = p_xchg_info->tx_length;
2002 if (((uint8_t)phHal_eIso15693_Cmd ==
2003 p_xchg_info->params.tag_info.cmd_type)
2004 #if defined(SUPPORT_ISO15693_RAW)
2005 || ((uint8_t) phHal_eIso15693_Raw ==
2006 p_xchg_info->params.tag_info.cmd_type)
2007 #endif
2008 )
2009 {
2010 status = phHciNfc_Send_ISO15693_Command(
2011 psHciContext, pHwRef
2012 ,reader_pipe_id, NXP_ISO15693_CMD );
2013 }
2014 else
2015 {
2016 status = PHNFCSTVAL(CID_NFC_HCI,
2017 NFCSTATUS_INVALID_PARAMETER);
2018 }
2019 }
2020 break;
2021 }
2022 #endif
2023 #ifdef TYPE_JEWEL
2024 case phHal_eJewel_PCD:
2025 {
2026 /* Get the Jewel Reader Pipe ID */
2027 status = phHciNfc_Jewel_Get_PipeID
2028 (psHciContext, &reader_pipe_id);
2029
2030 if( (NFCSTATUS_SUCCESS == status)
2031 && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID )
2032 )
2033 {
2034 uint8_t transact_type = 0;
2035 p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id];
2036 p_pipe_info->param_info = p_xchg_info->tx_buffer;
2037 p_pipe_info->param_length = p_xchg_info->tx_length;
2038 switch(p_xchg_info->params.tag_info.cmd_type)
2039 {
2040 case phHal_eJewel_Raw:
2041 {
2042 transact_type = NXP_JEWEL_RAW;
2043 break;
2044 }
2045 case phHal_eJewel_Invalid:
2046 default:
2047 {
2048 status = PHNFCSTVAL(CID_NFC_HCI,
2049 NFCSTATUS_INVALID_PARAMETER);
2050 break;
2051 }
2052 }
2053 if(0 != transact_type)
2054 {
2055 status = phHciNfc_Send_Jewel_Command(
2056 psHciContext, pHwRef,
2057 reader_pipe_id, transact_type );
2058 }
2059 }
2060 break;
2061 }
2062 #endif /* #ifdef TYPE_JEWEL */
2063 default:
2064 {
2065 status = PHNFCSTVAL(CID_NFC_HCI,
2066 NFCSTATUS_FEATURE_NOT_SUPPORTED);
2067 break;
2068 }
2069 }/* End of Reader Type Switch */
2070 }
2071
2072 return status;
2073 }
2074
2075
2076
2077 /*!
2078 * \brief Releases the resources allocated the RF Reader Management.
2079 *
2080 * This function Releases the resources allocated the RF Reader Management.
2081 */
2082
2083 NFCSTATUS
phHciNfc_ReaderMgmt_Release(phHciNfc_sContext_t * psHciContext,void * pHwRef)2084 phHciNfc_ReaderMgmt_Release(
2085 phHciNfc_sContext_t *psHciContext,
2086 void *pHwRef
2087 )
2088 {
2089 NFCSTATUS status = NFCSTATUS_SUCCESS;
2090 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
2091 phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL;
2092
2093 if( (NULL == psHciContext) || (NULL == pHwRef) )
2094 {
2095 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2096 }
2097 else
2098 {
2099 if( NULL != psHciContext->p_reader_mgmt_info )
2100 {
2101 p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *)
2102 psHciContext->p_reader_mgmt_info ;
2103 switch(p_reader_mgmt_info->rf_gate_cur_seq)
2104 {
2105 /* Reader A pipe close sequence */
2106 case READERA_PIPE_CLOSE:
2107 {
2108 p_pipe_info = ((phHciNfc_ReaderA_Info_t *)
2109 psHciContext->p_reader_a_info)->p_pipe_info;
2110
2111 status = phHciNfc_Close_Pipe( psHciContext,
2112 pHwRef, p_pipe_info );
2113 if(status == NFCSTATUS_SUCCESS)
2114 {
2115 p_reader_mgmt_info->rf_gate_next_seq =
2116 READERB_PIPE_CLOSE;
2117 /* status = NFCSTATUS_PENDING; */
2118 }
2119 break;
2120 }
2121 #ifdef TYPE_B
2122 /* Reader B pipe close sequence */
2123 case READERB_PIPE_CLOSE:
2124 {
2125 p_pipe_info = ((phHciNfc_ReaderB_Info_t *)
2126 psHciContext->p_reader_b_info)->p_pipe_info;
2127
2128 status = phHciNfc_Close_Pipe( psHciContext,
2129 pHwRef, p_pipe_info );
2130 if(status == NFCSTATUS_SUCCESS)
2131 {
2132 p_reader_mgmt_info->rf_gate_next_seq =
2133 FELICA_PROP_PIPE_CLOSE;
2134 status = NFCSTATUS_PENDING;
2135 }
2136 break;
2137 }
2138 #endif /* #ifdef TYPE_B */
2139 #ifdef TYPE_FELICA
2140 /* Felica Reader pipe close sequence */
2141 case FELICA_PROP_PIPE_CLOSE:
2142 {
2143 p_pipe_info = ((phHciNfc_Felica_Info_t *)
2144 psHciContext->p_felica_info)->p_pipe_info;
2145
2146 status = phHciNfc_Close_Pipe( psHciContext,
2147 pHwRef, p_pipe_info );
2148 if(status == NFCSTATUS_SUCCESS)
2149 {
2150 p_reader_mgmt_info->rf_gate_next_seq =
2151 NFCIP1_INITIATOR_PIPE_CLOSE;
2152 /* status = NFCSTATUS_PENDING; */
2153 }
2154 break;
2155 }
2156 #endif /* #ifdef TYPE_FELICA */
2157 #ifdef ENABLE_P2P
2158 /* NFC-IP1 Initiator pipe Close sequence */
2159 case NFCIP1_INITIATOR_PIPE_CLOSE:
2160 {
2161 p_pipe_info =
2162 ((phHciNfc_NfcIP_Info_t *)psHciContext->
2163 p_nfcip_info)->p_init_pipe_info;
2164 if(NULL == p_pipe_info )
2165 {
2166 status = PHNFCSTVAL(CID_NFC_HCI,
2167 NFCSTATUS_INVALID_HCI_SEQUENCE);
2168 }
2169 else
2170 {
2171 status = phHciNfc_Open_Pipe( psHciContext,
2172 pHwRef, p_pipe_info );
2173 if(status == NFCSTATUS_SUCCESS)
2174 {
2175 p_reader_mgmt_info->rf_gate_next_seq = READERA_PIPE_CLOSE;
2176 status = NFCSTATUS_PENDING;
2177 }
2178 }
2179 break;
2180 }
2181 #endif /* #ifdef ENABLE_P2P */
2182 default:
2183 {
2184 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
2185 break;
2186 }
2187
2188 }/* End of the Sequence Switch */
2189
2190 }/* End of the Reader Info Memory Check */
2191
2192 } /* End of Null Context Check */
2193
2194 return status;
2195 }
2196
2197
2198 /*!
2199 * \brief Sends the RF Reader HCI Events to the connected reader device.
2200 *
2201 * This function Sends the RF Reader HCI Event frames in the HCP packet format to the
2202 * connected reader device.
2203 */
2204
2205 NFCSTATUS
phHciNfc_Send_RFReader_Event(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t pipe_id,uint8_t event)2206 phHciNfc_Send_RFReader_Event (
2207 phHciNfc_sContext_t *psHciContext,
2208 void *pHwRef,
2209 uint8_t pipe_id,
2210 uint8_t event
2211 )
2212 {
2213 phHciNfc_HCP_Packet_t *hcp_packet = NULL;
2214 phHciNfc_HCP_Message_t *hcp_message = NULL;
2215 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
2216 uint8_t length = 0;
2217 uint8_t i = 0;
2218 NFCSTATUS status = NFCSTATUS_SUCCESS;
2219
2220 if( (NULL == psHciContext)
2221 || ( pipe_id > PHHCINFC_MAX_PIPE)
2222 ||(NULL == psHciContext->p_pipe_list[pipe_id])
2223 )
2224 {
2225 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2226 HCI_DEBUG("%s: Invalid Arguments passed \n",
2227 "phHciNfc_Send_RFReader_Event");
2228 }
2229 else
2230 {
2231 p_pipe_info = (phHciNfc_Pipe_Info_t *)
2232 psHciContext->p_pipe_list[pipe_id];
2233 psHciContext->tx_total = 0 ;
2234 length += HCP_HEADER_LEN ;
2235 switch( event )
2236 {
2237 case EVT_READER_REQUESTED:
2238 case EVT_END_OPERATION:
2239 {
2240
2241 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
2242 /* Construct the HCP Frame */
2243 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
2244 (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event);
2245 break;
2246 }
2247 case NXP_EVT_RELEASE_TARGET:
2248 {
2249 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
2250 /* Construct the HCP Frame */
2251 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
2252 (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event);
2253 hcp_message = &(hcp_packet->msg.message);
2254 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
2255 i, p_pipe_info->param_info,
2256 p_pipe_info->param_length);
2257 length =(uint16_t)(length + i + p_pipe_info->param_length);
2258 break;
2259 }
2260 default:
2261 {
2262 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED );
2263 HCI_DEBUG("%s: Statement Should Not Occur \n",
2264 "phHciNfc_Send_RFReader_Event");
2265 break;
2266 }
2267 }
2268 if( NFCSTATUS_SUCCESS == status )
2269 {
2270 p_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT ;
2271 p_pipe_info->prev_msg = event ;
2272 psHciContext->tx_total = length;
2273
2274 /* Send the Constructed HCP packet to the lower layer */
2275 status = phHciNfc_Send_HCP( psHciContext, pHwRef );
2276 p_pipe_info->prev_status = NFCSTATUS_PENDING;
2277 }
2278 }
2279
2280 return status;
2281 }
2282
2283 /*!
2284 * \brief Sends the RF Reader HCI Additonal Commands to the connected
2285 * reader device.
2286 *
2287 * This function Sends the RF Reader HCI Command frames in the HCP packet
2288 * format to the connected reader device.
2289 */
2290
2291 NFCSTATUS
phHciNfc_Send_RFReader_Command(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t pipe_id,uint8_t cmd)2292 phHciNfc_Send_RFReader_Command (
2293 phHciNfc_sContext_t *psHciContext,
2294 void *pHwRef,
2295 uint8_t pipe_id,
2296 uint8_t cmd
2297 )
2298 {
2299 phHciNfc_HCP_Packet_t *hcp_packet = NULL;
2300 phHciNfc_HCP_Message_t *hcp_message = NULL;
2301 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
2302 uint8_t i = 0;
2303 uint16_t length=0;
2304 NFCSTATUS status = NFCSTATUS_SUCCESS;
2305
2306 if( (NULL == psHciContext)
2307 || ( pipe_id > PHHCINFC_MAX_PIPE)
2308 ||(NULL == psHciContext->p_pipe_list[pipe_id])
2309 )
2310 {
2311 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2312 HCI_DEBUG("%s: Invalid Arguments passed \n",
2313 "phHciNfc_Send_RFReader_Command");
2314 }
2315 else
2316 {
2317 p_pipe_info = (phHciNfc_Pipe_Info_t *)
2318 psHciContext->p_pipe_list[pipe_id];
2319 psHciContext->tx_total = 0 ;
2320 length += HCP_HEADER_LEN ;
2321 switch( cmd )
2322 {
2323 case WR_XCHGDATA:
2324 {
2325
2326 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
2327 /* Construct the HCP Frame */
2328 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
2329 (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
2330 hcp_message = &(hcp_packet->msg.message);
2331 /* Frame Wait Timeout */
2332 hcp_message->payload[i++] = nxp_nfc_isoxchg_timeout ;
2333 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
2334 i, p_pipe_info->param_info,
2335 p_pipe_info->param_length);
2336 length =(uint16_t)(length + i + p_pipe_info->param_length);
2337 break;
2338 }
2339 case NXP_WR_PRESCHECK:
2340 case NXP_WR_ACTIVATE_NEXT:
2341 {
2342
2343 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
2344 /* Construct the HCP Frame */
2345 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
2346 (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
2347 break;
2348 }
2349 case NXP_WR_DISPATCH_TO_UICC:
2350 case NXP_WR_ACTIVATE_ID:
2351 {
2352
2353 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
2354 /* Construct the HCP Frame */
2355 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
2356 (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
2357 hcp_message = &(hcp_packet->msg.message);
2358 /* UID of the Card */
2359 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
2360 i, p_pipe_info->param_info,
2361 p_pipe_info->param_length);
2362 length =(uint16_t)(length + i + p_pipe_info->param_length);
2363 break;
2364 }
2365 default:
2366 {
2367 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED );
2368 HCI_DEBUG("%s: Statement Should Not Occur \n",
2369 "phHciNfc_Send_RFReader_Command");
2370 break;
2371 }
2372 }
2373 if( NFCSTATUS_SUCCESS == status )
2374 {
2375 p_pipe_info->sent_msg_type = HCP_MSG_TYPE_COMMAND;
2376 p_pipe_info->prev_msg = cmd;
2377 psHciContext->tx_total = length;
2378 psHciContext->response_pending = TRUE ;
2379
2380 /* Send the Constructed HCP packet to the lower layer */
2381 status = phHciNfc_Send_HCP( psHciContext, pHwRef );
2382 p_pipe_info->prev_status = NFCSTATUS_PENDING;
2383 }
2384 }
2385
2386 return status;
2387 }
2388
2389
2390
2391