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_Emulation.c *
22 * \brief HCI Emulation management routines. *
23 * *
24 * *
25 * Project: NFC-FRI-1.1 *
26 * *
27 * $Date: Tue Jun 8 09:30:37 2010 $ *
28 * $Author: ing04880 $ *
29 * $Revision: 1.52 $ *
30 * $Aliases: NFC_FRI1.1_WK1023_R35_1 $
31 * *
32 * =========================================================================== *
33 */
34
35 /*
36 ***************************** Header File Inclusion ****************************
37 */
38 #include <phNfcConfig.h>
39 #include <phNfcCompId.h>
40 #include <phNfcHalTypes.h>
41 #include <phHciNfc_Pipe.h>
42 #include <phHciNfc_Emulation.h>
43 #include <phHciNfc_WI.h>
44 #include <phHciNfc_SWP.h>
45 #ifdef ENABLE_P2P
46 #include <phHciNfc_NfcIPMgmt.h>
47 #endif
48 #ifdef HOST_EMULATION
49 #include <phHciNfc_CE_A.h>
50 #include <phHciNfc_CE_B.h>
51 #endif
52 #include <phOsalNfc.h>
53 /*
54 ****************************** Macro Definitions *******************************
55 */
56
57
58
59 /*
60 *************************** Structure and Enumeration ***************************
61 */
62
63 /** \defgroup grp_hci_nfc HCI Emulation Management Component
64 *
65 *
66 */
67
68 typedef enum phHciNfc_EmulationMgmt_Seq{
69 NFCIP_TARGET_PIPE_OPEN = 0x00U,
70 NFCIP_TARGET_MODE_CONFIG,
71 NFCIP_TARGET_MERGE_SAK,
72 NFCIP_TARGET_PIPE_CLOSE,
73
74 HOST_CE_A_INIT,
75 HOST_CE_A_RELEASE,
76
77 HOST_CE_B_INIT,
78 HOST_CE_B_RELEASE,
79
80 WI_PIPE_OPEN,
81 WI_ENABLE_EMULATION,
82 WI_DEFAULT_EMULATION,
83 WI_DISABLE_EMULATION,
84
85 WI_ENABLE_NOTIFICATION,
86 WI_DISABLE_NOTIFICATION,
87
88 WI_SWITCH_WIRED_MODE,
89 WI_SWITCH_DEFAULT_MODE,
90
91 WI_PIPE_CLOSE,
92
93 SWP_PIPE_OPEN,
94 SWP_ENABLE_EMULATION,
95 SWP_DEFAULT_EMULATION,
96 SWP_DETECTION,
97 SWP_DISABLE_EMULATION,
98 SWP_GET_BIT_RATE,
99 SWP_PIPE_CLOSE,
100
101 CONFIG_DEFAULT_EMULATION,
102
103 END_EMULATION_SEQ
104 } phHciNfc_EmulationMgmt_Seq_t;
105
106 typedef struct phHciNfc_EmulationMgmt_Info{
107 phHal_eEmulationType_t se_default;
108 uint8_t smx_powerless;
109 uint8_t uicc_enable;
110 uint8_t uicc_powerless;
111 uint8_t uicc_id;
112 /* Application ID of the UICC Transaction performed */
113 uint8_t uicc_aid[MAX_AID_LEN];
114 uint8_t uicc_param[MAX_UICC_PARAM_LEN];
115 uint8_t uicc_param_len;
116 phHciNfc_Pipe_Info_t *p_uicc_pipe_info;
117 phHciNfc_EmulationMgmt_Seq_t emulation_cur_seq;
118 phHciNfc_EmulationMgmt_Seq_t emulation_next_seq;
119
120
121 } phHciNfc_EmulationMgmt_Info_t;
122
123
124 /*
125 *************************** Static Function Declaration **************************
126 */
127
128 static
129 NFCSTATUS
130 phHciNfc_Recv_Uicc_Cmd (
131 void *psContext,
132 void *pHwRef,
133 uint8_t *pCmd,
134 #ifdef ONE_BYTE_LEN
135 uint8_t length
136 #else
137 uint16_t length
138 #endif
139 );
140
141 static
142 NFCSTATUS
143 phHciNfc_Recv_Uicc_Event (
144 void *psContext,
145 void *pHwRef,
146 uint8_t *pEvent,
147 #ifdef ONE_BYTE_LEN
148 uint8_t length
149 #else
150 uint16_t length
151 #endif
152 );
153
154
155 /*
156 *************************** Function Definitions ***************************
157 */
158
159 void
phHciNfc_Uicc_Connectivity(phHciNfc_sContext_t * psHciContext,void * pHwRef)160 phHciNfc_Uicc_Connectivity(
161 phHciNfc_sContext_t *psHciContext,
162 void *pHwRef
163 )
164 {
165 NFCSTATUS status = NFCSTATUS_SUCCESS;
166 phHciNfc_Pipe_Info_t *pPipeInfo = NULL;
167 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info = NULL;
168
169 if( NULL != psHciContext->p_emulation_mgmt_info )
170 {
171 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
172 psHciContext->p_emulation_mgmt_info ;
173 pPipeInfo = psHciContext->p_pipe_list[NXP_PIPE_CONNECTIVITY];
174 if( (TRUE == ((phHal_sHwReference_t *)pHwRef)->uicc_connected)
175 && (NULL == pPipeInfo))
176 {
177 status = phHciNfc_Allocate_Resource((void **)&pPipeInfo,
178 sizeof(phHciNfc_Pipe_Info_t));
179 if((NULL != pPipeInfo)
180 && (NFCSTATUS_SUCCESS == status))
181 {
182 /* The Source Host is the UICC Host */
183 pPipeInfo->pipe.source.host_id =
184 (uint8_t) phHciNfc_UICCHostID;
185 /* The Source Gate is same as the Destination Gate */
186 pPipeInfo->pipe.source.gate_id =
187 (uint8_t) phHciNfc_ConnectivityGate;
188 /* The Destination Host is the Terminal Host */
189 pPipeInfo->pipe.dest.host_id =
190 (uint8_t) phHciNfc_TerminalHostID;
191 /* The Source Gate is same as the Destination Gate */
192 pPipeInfo->pipe.dest.gate_id =
193 (uint8_t) phHciNfc_ConnectivityGate;
194 /* The Pipe ID is Hardcoded to Connectivity */
195 pPipeInfo->pipe.pipe_id = (uint8_t) NXP_PIPE_CONNECTIVITY;
196
197
198 status = phHciNfc_Uicc_Update_PipeInfo(psHciContext,
199 NXP_PIPE_CONNECTIVITY, pPipeInfo);
200 if (NFCSTATUS_SUCCESS == status)
201 {
202 psHciContext->p_pipe_list[NXP_PIPE_CONNECTIVITY] = pPipeInfo;
203 p_emulation_mgmt_info->uicc_enable = TRUE;
204 }
205 else
206 {
207 (void)phOsalNfc_FreeMemory(pPipeInfo);
208 }
209 }
210 }
211 }
212 return;
213 }
214
215 /*!
216 * \brief Get the pipe_id of Connectivity Managment Gate.
217 *
218 * This function Get the pipe_id of Connectivity Managment Gate.
219 *
220 */
221
222
223 NFCSTATUS
phHciNfc_Uicc_Get_PipeID(phHciNfc_sContext_t * psHciContext,uint8_t * ppipe_id)224 phHciNfc_Uicc_Get_PipeID(
225 phHciNfc_sContext_t *psHciContext,
226 uint8_t *ppipe_id
227 )
228 {
229 NFCSTATUS status = NFCSTATUS_SUCCESS;
230 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info = NULL;
231 if( (NULL != psHciContext)
232 && ( NULL != ppipe_id )
233 && ( NULL != psHciContext->p_emulation_mgmt_info )
234 )
235 {
236 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
237 psHciContext->p_emulation_mgmt_info ;
238 *ppipe_id = p_emulation_mgmt_info->uicc_id ;
239 }
240 else
241 {
242 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
243 }
244 return status;
245 }
246
247
248 /* Function to Update the Pipe Information */
249 NFCSTATUS
phHciNfc_Uicc_Update_PipeInfo(phHciNfc_sContext_t * psHciContext,uint8_t pipe_id,phHciNfc_Pipe_Info_t * pPipeInfo)250 phHciNfc_Uicc_Update_PipeInfo(
251 phHciNfc_sContext_t *psHciContext,
252 uint8_t pipe_id,
253 phHciNfc_Pipe_Info_t *pPipeInfo
254 )
255 {
256 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL;
257 NFCSTATUS status = NFCSTATUS_SUCCESS;
258
259 if( NULL == psHciContext )
260 {
261 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
262 }
263 else if ( NULL == psHciContext->p_emulation_mgmt_info )
264 {
265 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
266 }
267 else
268 {
269 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
270 psHciContext->p_emulation_mgmt_info ;
271 /* Update the pipe_id of the Connectivity Gate
272 * obtained from the HCI Response */
273 p_emulation_mgmt_info->uicc_id = pipe_id;
274 p_emulation_mgmt_info->p_uicc_pipe_info = pPipeInfo;
275 if ( NULL != pPipeInfo)
276 {
277 /* Update the Response Receive routine of the Connectivity Gate */
278 /* pPipeInfo->recv_resp = phHciNfc_Recv_Uicc_Response; */
279 pPipeInfo->recv_cmd = &phHciNfc_Recv_Uicc_Cmd;
280 pPipeInfo->recv_event = &phHciNfc_Recv_Uicc_Event;
281 }
282 }
283
284 return status;
285 }
286
287
288 /*!
289 * \brief Updates the Sequence of Emulation Managment Gate.
290 *
291 * This function Resets/Updates the sequence of the Emulation Management
292 * gate.
293 *
294 */
295
296
297 NFCSTATUS
phHciNfc_EmuMgmt_Update_Seq(phHciNfc_sContext_t * psHciContext,phHciNfc_eSeqType_t seq_type)298 phHciNfc_EmuMgmt_Update_Seq(
299 phHciNfc_sContext_t *psHciContext,
300 phHciNfc_eSeqType_t seq_type
301 )
302 {
303 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL;
304 NFCSTATUS status = NFCSTATUS_SUCCESS;
305 if( NULL == psHciContext )
306 {
307 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
308 }
309 else
310 {
311 if( NULL == psHciContext->p_emulation_mgmt_info )
312 {
313 status = PHNFCSTVAL(CID_NFC_HCI,
314 NFCSTATUS_INVALID_HCI_INFORMATION);
315 }
316 else
317 {
318 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
319 psHciContext->p_emulation_mgmt_info ;
320 switch(seq_type)
321 {
322 case RESET_SEQ:
323 case INIT_SEQ:
324 {
325 #ifdef ENABLE_P2P
326 p_emulation_mgmt_info->emulation_cur_seq = NFCIP_TARGET_PIPE_OPEN;
327 #else
328 p_emulation_mgmt_info->emulation_cur_seq = WI_PIPE_OPEN;
329 #endif
330 p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ ;
331 break;
332 }
333 case UPDATE_SEQ:
334 {
335 p_emulation_mgmt_info->emulation_cur_seq =
336 p_emulation_mgmt_info->emulation_next_seq;
337 break;
338 }
339 case INFO_SEQ:
340 {
341 p_emulation_mgmt_info->emulation_cur_seq = SWP_ENABLE_EMULATION;
342 p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ ;
343 break;
344 }
345 case REL_SEQ:
346 {
347 p_emulation_mgmt_info->emulation_cur_seq = WI_DISABLE_EMULATION;
348 p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ ;
349 break;
350 }
351 default:
352 {
353 break;
354 }
355 }
356 }
357 }
358
359 return status;
360 }
361
362
363 /*!
364 * \brief Initialisation of RF Emulation Gates.
365 *
366 * This function initialses the RF Emulation Management and
367 * populates the Reader Management Information Structure
368 *
369 */
370
371
372 NFCSTATUS
phHciNfc_EmuMgmt_Initialise(phHciNfc_sContext_t * psHciContext,void * pHwRef)373 phHciNfc_EmuMgmt_Initialise(
374 phHciNfc_sContext_t *psHciContext,
375 void *pHwRef
376 )
377 {
378 NFCSTATUS status = NFCSTATUS_SUCCESS;
379 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
380 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL;
381
382 if( NULL == psHciContext )
383 {
384 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
385 }
386 else
387 {
388
389 if( ( NULL == psHciContext->p_emulation_mgmt_info )
390 && (phHciNfc_Allocate_Resource((void **)(&p_emulation_mgmt_info),
391 sizeof(phHciNfc_EmulationMgmt_Info_t))== NFCSTATUS_SUCCESS)
392 )
393 {
394 psHciContext->p_emulation_mgmt_info = p_emulation_mgmt_info;
395 #ifdef ENABLE_P2P
396 p_emulation_mgmt_info->emulation_cur_seq = NFCIP_TARGET_PIPE_OPEN;
397 #else
398 p_emulation_mgmt_info->emulation_cur_seq = WI_PIPE_OPEN;
399 #endif
400 p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ;
401 p_emulation_mgmt_info->uicc_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
402 }
403 else
404 {
405 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
406 psHciContext->p_emulation_mgmt_info ;
407 }
408
409 if( NULL == psHciContext->p_emulation_mgmt_info )
410 {
411 status = PHNFCSTVAL(CID_NFC_HCI,
412 NFCSTATUS_INSUFFICIENT_RESOURCES);
413 }
414 #ifdef ESTABLISH_SESSION
415 else if(( hciMode_Session == psHciContext->hci_mode )
416 && (NFCIP_TARGET_PIPE_OPEN == p_emulation_mgmt_info->emulation_cur_seq )
417 )
418 {
419 status = NFCSTATUS_SUCCESS;
420 }
421 #endif
422 else
423 {
424 switch(p_emulation_mgmt_info->emulation_cur_seq )
425 {
426 #ifdef ENABLE_P2P
427 /* NFCIP Target Open sequence */
428 case NFCIP_TARGET_PIPE_OPEN:
429 {
430 p_pipe_info = ((phHciNfc_NfcIP_Info_t *)
431 psHciContext->p_nfcip_info)->p_tgt_pipe_info;
432 if(NULL == p_pipe_info )
433 {
434 status = PHNFCSTVAL(CID_NFC_HCI,
435 NFCSTATUS_INVALID_HCI_INFORMATION);
436 }
437 else
438 {
439 status = phHciNfc_Open_Pipe( psHciContext,
440 pHwRef, p_pipe_info );
441 if(status == NFCSTATUS_SUCCESS)
442 {
443 p_emulation_mgmt_info->emulation_next_seq =
444 NFCIP_TARGET_MODE_CONFIG;
445 status = NFCSTATUS_PENDING;
446 }
447 }
448 break;
449 }
450 /* NFCIP Target Mode Config sequence */
451 case NFCIP_TARGET_MODE_CONFIG:
452 {
453 #define NFCIP_ACTIVE_SHIFT 0x03U
454 #define NFCIP_PASSIVE_MASK 0x07U
455 uint8_t mode = ( NXP_NFCIP_ACTIVE_DEFAULT << NFCIP_ACTIVE_SHIFT ) |
456 ( DEFAULT_NFCIP_TARGET_MODE_SUPPORT & NFCIP_PASSIVE_MASK );
457 status = phHciNfc_NfcIP_SetMode( psHciContext, pHwRef,
458 NFCIP_TARGET, mode);
459 if(status == NFCSTATUS_PENDING )
460 {
461 #ifdef TGT_MERGE_SAK
462 p_emulation_mgmt_info->emulation_next_seq =
463 NFCIP_TARGET_MERGE_SAK;
464 #else
465 p_emulation_mgmt_info->emulation_next_seq =
466 WI_PIPE_OPEN;
467 #endif /* #ifdef TGT_MERGE_SAK */
468 /* status = NFCSTATUS_SUCCESS; */
469 }
470 break;
471 }
472 #ifdef TGT_MERGE_SAK
473 /* NFCIP Target SAK Merge sequence */
474 case NFCIP_TARGET_MERGE_SAK:
475 {
476 status = phHciNfc_NfcIP_SetMergeSak( psHciContext, pHwRef,
477 TRUE );
478 if(status == NFCSTATUS_PENDING )
479 {
480 p_emulation_mgmt_info->emulation_next_seq =
481 WI_PIPE_OPEN;
482 /* status = NFCSTATUS_SUCCESS; */
483 }
484 break;
485 }
486 #endif /* #ifdef TGT_MERGE_SAK */
487 #endif /* #ifdef ENABLE_P2P */
488 /* Secure Element WI pipe open sequence */
489 case WI_PIPE_OPEN:
490 {
491 p_pipe_info = ((phHciNfc_WI_Info_t *)
492 psHciContext->p_wi_info)->p_pipe_info;
493 if(NULL == p_pipe_info )
494 {
495 status = PHNFCSTVAL(CID_NFC_HCI,
496 NFCSTATUS_INVALID_HCI_INFORMATION);
497 }
498 else
499 {
500 status = phHciNfc_Open_Pipe( psHciContext,
501 pHwRef, p_pipe_info );
502 if(status == NFCSTATUS_SUCCESS)
503 {
504 #ifdef DISABLE_WI_NOTIFICATION
505 p_emulation_mgmt_info->emulation_next_seq =
506 SWP_PIPE_OPEN;
507 #else
508 p_emulation_mgmt_info->emulation_next_seq =
509 WI_ENABLE_NOTIFICATION;
510 #endif
511 status = NFCSTATUS_PENDING;
512 }
513 }
514 break;
515 }
516 /* Enable the SmartMx Notifications through WI */
517 case WI_ENABLE_NOTIFICATION:
518 {
519 p_pipe_info = ((phHciNfc_WI_Info_t *)
520 psHciContext->p_wi_info)->p_pipe_info;
521 if(NULL == p_pipe_info )
522 {
523 status = PHNFCSTVAL(CID_NFC_HCI,
524 NFCSTATUS_INVALID_HCI_INFORMATION);
525 }
526 else
527 {
528 status = phHciNfc_WI_Configure_Notifications(
529 psHciContext, pHwRef, eEnableEvents );
530 if(status == NFCSTATUS_PENDING)
531 {
532 p_emulation_mgmt_info->emulation_next_seq =
533 SWP_PIPE_OPEN;
534 }
535 }
536 break;
537 }
538 /* Enable the SmartMx Emulation by Default through WI */
539 case WI_ENABLE_EMULATION:
540 {
541 p_pipe_info = ((phHciNfc_WI_Info_t *)
542 psHciContext->p_wi_info)->p_pipe_info;
543 if(NULL == p_pipe_info )
544 {
545 status = PHNFCSTVAL(CID_NFC_HCI,
546 NFCSTATUS_INVALID_HCI_INFORMATION);
547 }
548 else
549 {
550 status = phHciNfc_WI_Configure_Default( psHciContext,
551 pHwRef, TRUE );
552 if(status == NFCSTATUS_PENDING)
553 {
554 p_emulation_mgmt_info->emulation_next_seq =
555 SWP_PIPE_OPEN;
556 }
557 }
558 break;
559 }
560 /* SWP pipe open sequence */
561 case SWP_PIPE_OPEN:
562 {
563 p_pipe_info = ((phHciNfc_SWP_Info_t *)
564 psHciContext->p_swp_info)->p_pipe_info;
565 if(NULL == p_pipe_info )
566 {
567 status = PHNFCSTVAL(CID_NFC_HCI,
568 NFCSTATUS_INVALID_HCI_INFORMATION);
569 }
570 else
571 {
572 status = phHciNfc_Open_Pipe( psHciContext,
573 pHwRef, p_pipe_info );
574 if(status == NFCSTATUS_SUCCESS)
575 {
576 p_emulation_mgmt_info->emulation_next_seq =
577 SWP_ENABLE_EMULATION;
578 #ifndef ESTABLISH_SESSION
579 status = NFCSTATUS_PENDING;
580 #endif
581 }
582 }
583 break;
584 }
585 /* Enable the UICC Emulation through SWP */
586 case SWP_ENABLE_EMULATION:
587 {
588 p_pipe_info = ((phHciNfc_SWP_Info_t *)
589 psHciContext->p_swp_info)->p_pipe_info;
590 if(NULL == p_pipe_info )
591 {
592 status = PHNFCSTVAL(CID_NFC_HCI,
593 NFCSTATUS_INVALID_HCI_INFORMATION);
594 }
595 else
596 {
597 #ifdef SWP_EVENT_USAGE
598 status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef,
599 UICC_SWITCH_MODE_ON );
600 /* UICC_SWITCH_MODE_DEFAULT */
601 #else
602 status = phHciNfc_SWP_Configure_Default( psHciContext,
603 pHwRef, TRUE );
604 #endif
605 if(status == NFCSTATUS_PENDING)
606 {
607 p_emulation_mgmt_info->emulation_next_seq =
608 SWP_DETECTION;
609 /* status = NFCSTATUS_SUCCESS; */
610 }
611 }
612 break;
613 }
614 /* Disable the UICC Emulation through SWP */
615 case SWP_DETECTION:
616 {
617 p_pipe_info = ((phHciNfc_SWP_Info_t *)
618 psHciContext->p_swp_info)->p_pipe_info;
619 if(NULL == p_pipe_info )
620 {
621 status = PHNFCSTVAL(CID_NFC_HCI,
622 NFCSTATUS_INVALID_HCI_INFORMATION);
623 break;
624 }
625 else
626 {
627 status = phHciNfc_Uicc_Connect_Status(
628 psHciContext, pHwRef );
629 if(status == NFCSTATUS_SUCCESS)
630 {
631 uint8_t uicc_connect = ((phHciNfc_SWP_Info_t *)
632 psHciContext->p_swp_info)->uicc_status;
633 if(UICC_CONNECTED == uicc_connect)
634 {
635 #ifdef SWP_EVENT_USAGE
636 p_emulation_mgmt_info->emulation_next_seq =
637 SWP_DISABLE_EMULATION;
638 #else
639 p_emulation_mgmt_info->emulation_next_seq =
640 WI_DISABLE_EMULATION;
641 #endif
642 ((phHal_sHwReference_t *)
643 pHwRef)->uicc_connected = TRUE;
644 status = NFCSTATUS_PENDING;
645 }
646 else
647 {
648 status = phHciNfc_SWP_Configure_Mode( psHciContext,
649 pHwRef, UICC_SWITCH_MODE_DEFAULT );
650 (NFCSTATUS_PENDING == status)?
651 (p_emulation_mgmt_info->emulation_next_seq =
652 WI_DISABLE_EMULATION):
653 (p_emulation_mgmt_info->emulation_next_seq =
654 SWP_DETECTION);
655 break;
656 }
657 }
658 else
659 {
660 break;
661 }
662 }
663 }
664 /* fall through */
665 /* Disable the SmartMx Emulation through WI */
666 case WI_DISABLE_EMULATION:
667 {
668 p_pipe_info = ((phHciNfc_WI_Info_t *)
669 psHciContext->p_wi_info)->p_pipe_info;
670 if(NULL == p_pipe_info )
671 {
672 status = PHNFCSTVAL(CID_NFC_HCI,
673 NFCSTATUS_INVALID_HCI_INFORMATION);
674 }
675 else
676 {
677 status = phHciNfc_WI_Configure_Mode( psHciContext,
678 pHwRef, eSmartMx_Default );
679 if(status == NFCSTATUS_PENDING)
680 {
681 p_emulation_mgmt_info->emulation_next_seq =
682 SWP_DISABLE_EMULATION;
683 status = NFCSTATUS_SUCCESS;
684 }
685 }
686 break;
687 }
688 #ifndef SWP_EVENT_USAGE
689 /* fall through */
690 /* Get the UICC Baud Rate Status */
691 case SWP_GET_BIT_RATE:
692 {
693 p_pipe_info = ((phHciNfc_SWP_Info_t *)
694 psHciContext->p_swp_info)->p_pipe_info;
695 if(NULL == p_pipe_info )
696 {
697 status = PHNFCSTVAL(CID_NFC_HCI,
698 NFCSTATUS_INVALID_HCI_INFORMATION);
699 }
700 else
701 {
702 status = phHciNfc_SWP_Get_Bitrate(
703 psHciContext, pHwRef );
704 if(status == NFCSTATUS_PENDING)
705 {
706 p_emulation_mgmt_info->emulation_next_seq =
707 SWP_DISABLE_EMULATION;
708 status = NFCSTATUS_SUCCESS;
709 }
710 }
711 break;
712 }
713 #endif
714 /* fall through */
715 /* Disable the UICC Emulation through SWP */
716 case SWP_DISABLE_EMULATION:
717 {
718 p_pipe_info = ((phHciNfc_SWP_Info_t *)
719 psHciContext->p_swp_info)->p_pipe_info;
720 if(NULL == p_pipe_info )
721 {
722 status = PHNFCSTVAL(CID_NFC_HCI,
723 NFCSTATUS_INVALID_HCI_INFORMATION);
724 }
725 else
726 {
727 status = phHciNfc_SWP_Configure_Mode( psHciContext,
728 pHwRef, UICC_SWITCH_MODE_DEFAULT );
729 if(status == NFCSTATUS_PENDING)
730 {
731 p_emulation_mgmt_info->emulation_next_seq =
732 WI_DISABLE_EMULATION;
733 /* Disable WI Emulation for Previous Wired
734 * Mode Set */
735 /* status = NFCSTATUS_SUCCESS; */
736 }
737 }
738 break;
739 }
740 default:
741 {
742 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
743 break;
744 }
745
746 }/* End of the Sequence Switch */
747
748 }/* End of the Reader Info Memory Check */
749
750 } /* End of Null Context Check */
751
752 return status;
753 }
754
755 /*!
756 * \brief Connection Routine for the Uicc.
757 *
758 * This function tries to enable and initialise the UICC connected
759 * through SWP.
760 *
761 */
762
763
764 NFCSTATUS
phHciNfc_Uicc_Connect_Status(phHciNfc_sContext_t * psHciContext,void * pHwRef)765 phHciNfc_Uicc_Connect_Status(
766 phHciNfc_sContext_t *psHciContext,
767 void *pHwRef
768 )
769 {
770 NFCSTATUS status = NFCSTATUS_SUCCESS;
771 /* phHciNfc_Pipe_Info_t *p_pipe_info = NULL; */
772 /* phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL; */
773 static uint32_t uicc_connection_retry = 0;
774
775 if( NULL == psHciContext )
776 {
777 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
778 }
779 else
780 {
781 phHciNfc_SWP_Status_t uicc_status =
782 ((phHciNfc_SWP_Info_t *)
783 psHciContext->p_swp_info)->uicc_status;
784 if(uicc_connection_retry == 0)
785 {
786 #ifdef UICC_STATUS_DELAY
787 for( ;uicc_connection_retry < UICC_STATUS_DELAY_COUNT;
788 uicc_connection_retry ++ );
789 uicc_connection_retry = 0;
790 #endif
791 status = phHciNfc_SWP_Get_Status(
792 psHciContext, pHwRef );
793 if (NFCSTATUS_PENDING == status)
794 {
795 uicc_connection_retry++;
796 }
797 }
798 else
799 {
800 switch(uicc_status)
801 {
802 case UICC_CONNECTION_ONGOING:
803 case UICC_DISCONNECTION_ONGOING:
804 case UICC_NOT_CONNECTED:
805 {
806 if(uicc_connection_retry <
807 UICC_MAX_CONNECT_RETRY)
808 {
809 status = phHciNfc_SWP_Get_Status(
810 psHciContext, pHwRef );
811 if (NFCSTATUS_PENDING == status)
812 {
813 uicc_connection_retry++;
814 }
815 }
816 break;
817 }
818 case UICC_CONNECTED:
819 {
820 break;
821 }
822 case UICC_CONNECTION_LOST:
823 case UICC_CONNECTION_FAILED:
824 default:
825 {
826 uicc_connection_retry = 0;
827 break;
828 }
829 } /* End of the Status Switch */
830 }
831
832 if( NFCSTATUS_PENDING != status )
833 {
834 uicc_connection_retry = 0;
835 /* Error Scenario due to SWP Disable Config */
836 }
837
838 } /* End of Null Context Check */
839
840 return status;
841 }
842
843 /*!
844 * \brief Release of RF Emulation Gate Configuration.
845 *
846 * This function initialses the RF Emulation Management and
847 * populates the Reader Management Information Structure
848 *
849 */
850
851
852 NFCSTATUS
phHciNfc_EmuMgmt_Release(phHciNfc_sContext_t * psHciContext,void * pHwRef)853 phHciNfc_EmuMgmt_Release(
854 phHciNfc_sContext_t *psHciContext,
855 void *pHwRef
856 )
857 {
858 NFCSTATUS status = NFCSTATUS_SUCCESS;
859 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
860 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL;
861
862 if( NULL == psHciContext )
863 {
864 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
865 }
866 else
867 {
868
869 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
870 psHciContext->p_emulation_mgmt_info ;
871
872 if( NULL == psHciContext->p_emulation_mgmt_info )
873 {
874 status = PHNFCSTVAL(CID_NFC_HCI,
875 NFCSTATUS_INSUFFICIENT_RESOURCES);
876 }
877 else
878 {
879 switch(p_emulation_mgmt_info->emulation_cur_seq )
880 {
881 /* Enable/Disable the SmartMx Emulation through WI
882 * After the power down
883 */
884 /* Enable the SmartMx Emulation by Default through WI */
885 case WI_DEFAULT_EMULATION:
886 {
887 p_pipe_info = ((phHciNfc_WI_Info_t *)
888 psHciContext->p_wi_info)->p_pipe_info;
889 if(NULL == p_pipe_info )
890 {
891 status = PHNFCSTVAL(CID_NFC_HCI,
892 NFCSTATUS_INVALID_HCI_INFORMATION);
893 }
894 else
895 {
896 status = phHciNfc_WI_Configure_Default( psHciContext,
897 pHwRef, p_emulation_mgmt_info->smx_powerless );
898 if(status == NFCSTATUS_PENDING)
899 {
900 p_emulation_mgmt_info->emulation_next_seq =
901 WI_DISABLE_EMULATION;
902 }
903 }
904 break;
905 }
906 /* SmartMx In Default Mode */
907 case WI_DISABLE_EMULATION:
908 {
909 p_pipe_info = ((phHciNfc_WI_Info_t *)
910 psHciContext->p_wi_info)->p_pipe_info;
911 if(NULL == p_pipe_info )
912 {
913 status = PHNFCSTVAL(CID_NFC_HCI,
914 NFCSTATUS_INVALID_HCI_INFORMATION);
915 }
916 else
917 {
918 status = phHciNfc_WI_Configure_Mode( psHciContext,
919 pHwRef, eSmartMx_Default );
920 if(status == NFCSTATUS_SUCCESS )
921 {
922 p_emulation_mgmt_info->emulation_next_seq =
923 SWP_DISABLE_EMULATION;
924 status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
925 UPDATE_SEQ);
926 /* status = NFCSTATUS_PENDING; */
927 }
928 }
929 break;
930 }
931 /* Enable/Disable the UICC Emulation through SWP
932 * After the power down
933 */
934 /* Enable the UICC Emulation by Default through SWP */
935 case SWP_DEFAULT_EMULATION:
936 {
937 p_pipe_info = ((phHciNfc_SWP_Info_t *)
938 psHciContext->p_swp_info)->p_pipe_info;
939 if(NULL == p_pipe_info )
940 {
941 status = PHNFCSTVAL(CID_NFC_HCI,
942 NFCSTATUS_INVALID_HCI_INFORMATION);
943 }
944 else
945 {
946 status = phHciNfc_SWP_Configure_Default( psHciContext,
947 pHwRef, p_emulation_mgmt_info->uicc_powerless );
948 if(status == NFCSTATUS_PENDING)
949 {
950 p_emulation_mgmt_info->emulation_next_seq =
951 SWP_DISABLE_EMULATION;
952 /* status = NFCSTATUS_SUCCESS; */
953 }
954 }
955 break;
956 }
957 /* Disable the UICC Emulation through SWP */
958 case SWP_DISABLE_EMULATION:
959 {
960 p_pipe_info = ((phHciNfc_SWP_Info_t *)
961 psHciContext->p_swp_info)->p_pipe_info;
962 if(NULL == p_pipe_info )
963 {
964 status = PHNFCSTVAL(CID_NFC_HCI,
965 NFCSTATUS_INVALID_HCI_INFORMATION);
966 }
967 else
968 {
969 status = phHciNfc_SWP_Configure_Mode( psHciContext,
970 pHwRef, UICC_SWITCH_MODE_DEFAULT );
971 if(status == NFCSTATUS_PENDING)
972 {
973 p_emulation_mgmt_info->emulation_next_seq =
974 CONFIG_DEFAULT_EMULATION;
975 status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
976 UPDATE_SEQ);
977 status = NFCSTATUS_SUCCESS;
978 }
979 }
980 break;
981 }
982 /* Configure the Default Secure Element Emulation */
983 case CONFIG_DEFAULT_EMULATION:
984 {
985 #if 0
986 if(NULL == p_pipe_info )
987 {
988 status = PHNFCSTVAL(CID_NFC_HCI,
989 NFCSTATUS_INVALID_HCI_INFORMATION);
990 }
991 else
992 {
993 /* status = phHciNfc_DevMgmt_Configure( psHciContext,
994 pHwRef, , ); */
995 if(status == NFCSTATUS_PENDING)
996 {
997 p_emulation_mgmt_info->emulation_next_seq =
998 END_EMULATION_SEQ;
999 status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
1000 UPDATE_SEQ);
1001 status = NFCSTATUS_SUCCESS;
1002 }
1003 }
1004 #endif
1005 break;
1006 }
1007 default:
1008 {
1009 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
1010 break;
1011 }
1012
1013 }/* End of the Sequence Switch */
1014
1015 }/* End of the Reader Info Memory Check */
1016
1017 } /* End of Null Context Check */
1018
1019 return status;
1020 }
1021
1022 #if 0
1023 NFCSTATUS
1024 phHciNfc_Emulation_Start (
1025 phHciNfc_sContext_t *psHciContext,
1026 void *pHwRef
1027 )
1028 {
1029 NFCSTATUS status = NFCSTATUS_SUCCESS;
1030
1031 return status;
1032 }
1033 #endif
1034
1035 NFCSTATUS
phHciNfc_Emulation_Cfg(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_eConfigType_t cfg_type)1036 phHciNfc_Emulation_Cfg (
1037 phHciNfc_sContext_t *psHciContext,
1038 void *pHwRef,
1039 phHciNfc_eConfigType_t cfg_type
1040 )
1041 {
1042 NFCSTATUS status = NFCSTATUS_SUCCESS;
1043 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL;
1044 phHal_sEmulationCfg_t *p_emulation_cfg = NULL;
1045
1046 if( (NULL == psHciContext) || (NULL == pHwRef) )
1047 {
1048 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1049 }
1050 else if ( ( NULL == psHciContext->p_emulation_mgmt_info )
1051 || ( NULL == psHciContext->p_config_params ) )
1052 {
1053 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
1054 }
1055 else
1056 {
1057 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
1058 psHciContext->p_emulation_mgmt_info ;
1059 p_emulation_cfg = psHciContext->p_config_params;
1060 switch(cfg_type)
1061 {
1062 case SMX_WI_CFG:
1063 {
1064 phHal_sSmartMX_Cfg_t *smx_config =
1065 &p_emulation_cfg->config.smartMxCfg;
1066 p_emulation_mgmt_info->smx_powerless =
1067 (uint8_t)(FALSE != smx_config->lowPowerMode );
1068 status = phHciNfc_WI_Configure_Default( psHciContext, pHwRef,
1069 smx_config->enableEmulation );
1070 break;
1071 }
1072 case UICC_SWP_CFG:
1073 {
1074 #ifdef SWP_CFG_SEQ
1075 phHal_sUiccEmuCfg_t *uicc_config =
1076 &p_emulation_cfg->config.uiccEmuCfg;
1077 p_emulation_mgmt_info->uicc_powerless =
1078 (uint8_t)(FALSE != uicc_config->lowPowerMode );
1079 {
1080 #ifdef SWP_EVENT_USAGE
1081 status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef,
1082 ((TRUE == uicc_config->enableUicc)? /* UICC_SWITCH_MODE_DEFAULT */
1083 UICC_SWITCH_MODE_ON :UICC_SWITCH_MODE_OFF));
1084 #else
1085 status = phHciNfc_SWP_Configure_Default( psHciContext, pHwRef,
1086 uicc_config->enableUicc );
1087 #endif
1088 }
1089 #else
1090 status = phHciNfc_SWP_Config_Sequence( psHciContext,
1091 pHwRef, p_emulation_cfg);
1092 #endif
1093 break;
1094 }
1095 case SWP_EVT_CFG:
1096 {
1097 phHal_sUiccEmuCfg_t *uicc_config =
1098 &p_emulation_cfg->config.uiccEmuCfg;
1099 p_emulation_mgmt_info->uicc_powerless =
1100 (uint8_t)(FALSE != uicc_config->lowPowerMode );
1101 {
1102 status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef,
1103 ((TRUE == uicc_config->enableUicc)? /* UICC_SWITCH_MODE_DEFAULT */
1104 UICC_SWITCH_MODE_ON :UICC_SWITCH_MODE_DEFAULT));
1105 }
1106 break;
1107 }
1108 #ifdef HOST_EMULATION
1109 case NFC_CE_A_CFG:
1110 {
1111 phHal_sHostEmuCfg_A_t *host_ce_a_cfg =
1112 &p_emulation_cfg->config.hostEmuCfg_A;
1113 if(host_ce_a_cfg->enableEmulation == TRUE )
1114 {
1115 status = phHciNfc_CE_A_Initialise( psHciContext, pHwRef);
1116 }
1117 else
1118 {
1119 status = phHciNfc_CE_A_Release( psHciContext, pHwRef);
1120 }
1121 break;
1122 }
1123 case NFC_CE_B_CFG:
1124 {
1125 phHal_sHostEmuCfg_B_t *host_ce_b_cfg =
1126 &p_emulation_cfg->config.hostEmuCfg_B;
1127 if(host_ce_b_cfg->enableEmulation == TRUE )
1128 {
1129 status = phHciNfc_CE_B_Initialise( psHciContext, pHwRef);
1130 }
1131 else
1132 {
1133 status = phHciNfc_CE_B_Release( psHciContext, pHwRef);
1134 }
1135 break;
1136 }
1137 #endif
1138 /* case INVALID_CFG:
1139 case POLL_LOOP_CFG: */
1140 default:
1141 {
1142 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
1143 break;
1144 }
1145
1146 } /* End of the Configuration Switch */
1147 }
1148
1149 return status;
1150 }
1151
1152
1153 static
1154 NFCSTATUS
phHciNfc_Recv_Uicc_Cmd(void * psContext,void * pHwRef,uint8_t * pCmd,uint8_t length)1155 phHciNfc_Recv_Uicc_Cmd (
1156 void *psContext,
1157 void *pHwRef,
1158 uint8_t *pCmd,
1159 #ifdef ONE_BYTE_LEN
1160 uint8_t length
1161 #else
1162 uint16_t length
1163 #endif
1164 )
1165 {
1166 uint8_t pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
1167 uint8_t cmd = (uint8_t) HCP_MSG_INSTRUCTION_INVALID;
1168 uint8_t response = (uint8_t) ANY_OK;
1169 NFCSTATUS status = NFCSTATUS_SUCCESS;
1170 phHciNfc_sContext_t *psHciContext =
1171 (phHciNfc_sContext_t *)psContext ;
1172 phHciNfc_HCP_Packet_t *hcp_packet = NULL;
1173 phHciNfc_HCP_Message_t *hcp_message = NULL;
1174 phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
1175 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL;
1176
1177 if( (NULL == psHciContext)
1178 || (NULL == pHwRef)
1179 || (HCP_HEADER_LEN > length )
1180 )
1181 {
1182 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1183 }
1184 else
1185 {
1186 hcp_packet = (phHciNfc_HCP_Packet_t *)pCmd;
1187 hcp_message = &hcp_packet->msg.message;
1188 p_emulation_mgmt_info = psHciContext->p_emulation_mgmt_info;
1189
1190 /* Get the Command instruction bits from the Message Header */
1191 cmd = (uint8_t) GET_BITS8( hcp_message->msg_header,
1192 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
1193 pipe_id = p_emulation_mgmt_info->uicc_id;
1194 p_pipe_info = psHciContext->p_pipe_list[pipe_id];
1195
1196 switch( cmd )
1197 {
1198 /* These are Commands are sent from the UICC Controller */
1199 case ANY_OPEN_PIPE:
1200 {
1201 p_emulation_mgmt_info->uicc_enable = TRUE ;
1202 break;
1203 }
1204 case ANY_CLOSE_PIPE:
1205 {
1206 if(TRUE != p_emulation_mgmt_info->uicc_enable)
1207 {
1208 response = ANY_E_PIPE_NOT_OPENED;
1209 /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FAILED); */
1210 }
1211 else
1212 {
1213 p_emulation_mgmt_info->uicc_enable = FALSE;
1214 }
1215 break;
1216 }
1217 case ANY_SET_PARAMETER:
1218 case ANY_GET_PARAMETER:
1219 case PRO_HOST_REQUEST:
1220 {
1221 response = ANY_E_CMD_NOT_SUPPORTED;
1222 /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_COMMAND_NOT_SUPPORTED);*/
1223 break;
1224 }
1225 default:
1226 {
1227 response = ANY_E_NOK;
1228 /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_COMMAND); */
1229 break;
1230 }
1231 }
1232 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
1233 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
1234 pipe_id, HCP_MSG_TYPE_RESPONSE, response );
1235 psHciContext->tx_total = HCP_HEADER_LEN;
1236 status = phHciNfc_Send_HCP( (void *)psHciContext, (void *)pHwRef );
1237
1238 p_pipe_info->recv_msg_type = HCP_MSG_TYPE_COMMAND;
1239 p_pipe_info->sent_msg_type = HCP_MSG_TYPE_RESPONSE;
1240 p_pipe_info->prev_msg = response ;
1241 p_pipe_info->prev_status = status;
1242 status = NFCSTATUS_SUCCESS;
1243
1244 }
1245 return status;
1246 }
1247
1248 static
1249 NFCSTATUS
phHciNfc_Recv_Uicc_Event(void * psContext,void * pHwRef,uint8_t * pEvent,uint8_t length)1250 phHciNfc_Recv_Uicc_Event (
1251 void *psContext,
1252 void *pHwRef,
1253 uint8_t *pEvent,
1254 #ifdef ONE_BYTE_LEN
1255 uint8_t length
1256 #else
1257 uint16_t length
1258 #endif
1259 )
1260 {
1261 uint8_t event = (uint8_t) HCP_MSG_INSTRUCTION_INVALID;
1262 uint32_t i = 0;
1263 NFCSTATUS status = NFCSTATUS_SUCCESS;
1264 phHciNfc_sContext_t *psHciContext =
1265 (phHciNfc_sContext_t *)psContext ;
1266 phHciNfc_HCP_Packet_t *hcp_packet = NULL;
1267 phHciNfc_HCP_Message_t *hcp_message = NULL;
1268 phHal_sEventInfo_t event_info;
1269 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info =
1270 psHciContext->p_emulation_mgmt_info ;
1271
1272
1273 if( (NULL == p_emulation_mgmt_info)
1274 || ( TRUE != p_emulation_mgmt_info->uicc_enable)
1275 )
1276 {
1277 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1278 }
1279 else
1280 {
1281 hcp_packet = (phHciNfc_HCP_Packet_t *)pEvent;
1282 hcp_message = &hcp_packet->msg.message;
1283
1284 /* Get the Event instruction bits from the Message Header */
1285 event = (uint8_t) GET_BITS8( hcp_message->msg_header,
1286 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
1287 event_info.eventHost = phHal_eUICCHost ;
1288 event_info.eventSource = phHal_ePICC_DevType ;
1289
1290 switch( event )
1291 {
1292 case EVT_END_OF_TRANSACTION:
1293 {
1294 event_info.eventType = NFC_EVT_END_OF_TRANSACTION;
1295 break;
1296 }
1297 case EVT_TRANSACTION:
1298 {
1299 if(length > HCP_HEADER_LEN + TRANSACTION_MIN_LEN)
1300 {
1301 event_info.eventType = NFC_EVT_TRANSACTION;
1302
1303 for(;i<(length-HCP_HEADER_LEN);)
1304 {
1305 switch (hcp_message->payload[i])
1306 {
1307 case TRANSACTION_AID:
1308 {
1309 /* AID LENGTH INDEX */
1310 i++;
1311 /* Fill the event_info.eventInfo.aid
1312 * Structure with the Received Transaction AID.
1313 */
1314 event_info.eventInfo.aid.length =
1315 hcp_message->payload[i++];
1316 (void) memcpy((void *)p_emulation_mgmt_info->uicc_aid,
1317 &(hcp_message->payload[i]),
1318 event_info.eventInfo.aid.length );
1319 event_info.eventInfo.aid.buffer = (uint8_t *)
1320 p_emulation_mgmt_info->uicc_aid;
1321 i = i + event_info.eventInfo.aid.length;
1322 break;
1323 }
1324 case TRANSACTION_PARAM:
1325 {
1326 /* Parameter Length Index */
1327 i++;
1328 /* Fill the event_info.eventInfo.param
1329 * Structure with the Received Parameter.
1330 */
1331 p_emulation_mgmt_info->uicc_param_len =
1332 hcp_message->payload[i++];
1333 (void) memcpy((void *)p_emulation_mgmt_info->uicc_param,
1334 &(hcp_message->payload[i]),
1335 p_emulation_mgmt_info->uicc_param_len );
1336 event_info.eventInfo.uicc_info.param.length =
1337 p_emulation_mgmt_info->uicc_param_len;
1338 event_info.eventInfo.uicc_info.param.buffer = (uint8_t *)
1339 p_emulation_mgmt_info->uicc_param;
1340 i = i + event_info.eventInfo.uicc_info.param.length;
1341 break;
1342 }
1343 default:
1344 {
1345
1346 status = PHNFCSTVAL( CID_NFC_HCI,
1347 NFCSTATUS_FEATURE_NOT_SUPPORTED );
1348 i = length;
1349 HCI_DEBUG("%s: Statement Should Not Occur \n",
1350 "phHciNfc_Recv_Uicc_Event");
1351 break;
1352 }
1353 } /* End of Transaction Switch */
1354 }
1355 }
1356 break;
1357 }
1358 case EVT_CONNECTIVITY:
1359 {
1360 event_info.eventType = NFC_EVT_CONNECTIVITY;
1361 break;
1362 }
1363 case EVT_OPERATION_ENDED:
1364 {
1365 event_info.eventType = NFC_EVT_OPERATION_ENDED;
1366 break;
1367 }
1368 default:
1369 {
1370 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED );
1371 HCI_DEBUG("%s: Statement Should Not Occur \n","phHciNfc_Recv_Uicc_Event");
1372 break;
1373 }
1374 }
1375 if ( NFCSTATUS_SUCCESS == status )
1376 {
1377 phHciNfc_Notify_Event( psHciContext, pHwRef,
1378 NFC_NOTIFY_EVENT, (void *)&event_info );
1379 }
1380 }
1381 return status;
1382 }
1383
1384
1385