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_CE_A.c *
22 * \brief HCI card emulation A management routines. *
23 * *
24 * *
25 * Project: NFC-FRI-1.1 *
26 * *
27 * $Date: Fri Aug 21 18:35:05 2009 $ *
28 * $Author: ing04880 $ *
29 * $Revision: 1.14 $ *
30 * $Aliases: NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
31 * *
32 * =========================================================================== *
33 */
34
35 /*
36 ***************************** Header File Inclusion ****************************
37 */
38 #include <phNfcCompId.h>
39 #include <phNfcHalTypes.h>
40 #include <phHciNfc_Pipe.h>
41 #include <phHciNfc_Emulation.h>
42 #include <phOsalNfc.h>
43 /*
44 ****************************** Macro Definitions *******************************
45 */
46 #if defined (HOST_EMULATION)
47 #include <phHciNfc_CE_A.h>
48
49 #define CE_A_EVT_NFC_SEND_DATA 0x10U
50 #define CE_A_EVT_NFC_FIELD_ON 0x11U
51 #define CE_A_EVT_NFC_DEACTIVATED 0x12U
52 #define CE_A_EVT_NFC_ACTIVATED 0x13U
53 #define CE_A_EVT_NFC_FIELD_OFF 0x14U
54
55 /*
56 *************************** Structure and Enumeration ***************************
57 */
58
59
60 /*
61 *************************** Static Function Declaration **************************
62 */
63
64 static
65 NFCSTATUS
66 phHciNfc_Recv_CE_A_Event(
67 void *psContext,
68 void *pHwRef,
69 uint8_t *pEvent,
70 #ifdef ONE_BYTE_LEN
71 uint8_t length
72 #else
73 uint16_t length
74 #endif
75 );
76
77 static
78 NFCSTATUS
79 phHciNfc_Recv_CE_A_Response(
80 void *psContext,
81 void *pHwRef,
82 uint8_t *pResponse,
83 #ifdef ONE_BYTE_LEN
84 uint8_t length
85 #else
86 uint16_t length
87 #endif
88 );
89
90 #if defined (SEND_DATA_EVENT)
91 static
92 NFCSTATUS
93 phHciNfc_CE_A_ProcessData(
94 phHciNfc_sContext_t *psHciContext,
95 void *pHwRef,
96 uint8_t *pData,
97 uint8_t length
98 );
99 #endif /* #if defined (SEND_DATA_EVENT) */
100
101 /*
102 *************************** Function Definitions ***************************
103 */
104 NFCSTATUS
phHciNfc_CE_A_Init_Resources(phHciNfc_sContext_t * psHciContext)105 phHciNfc_CE_A_Init_Resources(
106 phHciNfc_sContext_t *psHciContext
107 )
108 {
109 NFCSTATUS status = NFCSTATUS_SUCCESS;
110 phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL;
111 if( NULL == psHciContext )
112 {
113 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
114 }
115 else
116 {
117 if(
118 ( NULL == psHciContext->p_ce_a_info ) &&
119 (phHciNfc_Allocate_Resource((void **)(&ps_ce_a_info),
120 sizeof(phHciNfc_CE_A_Info_t))== NFCSTATUS_SUCCESS)
121 )
122 {
123 psHciContext->p_ce_a_info = ps_ce_a_info;
124 ps_ce_a_info->current_seq = HOST_CE_A_INVALID_SEQ;
125 ps_ce_a_info->next_seq = HOST_CE_A_INVALID_SEQ;
126 ps_ce_a_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
127 }
128 else
129 {
130 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
131 }
132
133 }
134 return status;
135 }
136
137 NFCSTATUS
phHciNfc_CE_A_Initialise(phHciNfc_sContext_t * psHciContext,void * pHwRef)138 phHciNfc_CE_A_Initialise(
139 phHciNfc_sContext_t *psHciContext,
140 void *pHwRef
141 )
142 {
143 /*
144 1. Open Pipe,
145 2. Set all parameters
146 */
147 NFCSTATUS status = NFCSTATUS_SUCCESS;
148 static uint8_t sak = HOST_CE_A_SAK_DEFAULT;
149 static uint8_t atqa_info[] = { NXP_CE_A_ATQA_HIGH,
150 NXP_CE_A_ATQA_LOW};
151
152 if ((NULL == psHciContext) || (NULL == pHwRef))
153 {
154 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
155 }
156 else if(NULL == psHciContext->p_ce_a_info)
157 {
158 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
159 }
160 else
161 {
162 phHciNfc_CE_A_Info_t *ps_ce_a_info = ((phHciNfc_CE_A_Info_t *)
163 psHciContext->p_ce_a_info );
164 phHciNfc_Pipe_Info_t *ps_pipe_info = NULL;
165
166 ps_pipe_info = ps_ce_a_info->p_pipe_info;
167 if(NULL == ps_pipe_info )
168 {
169 status = PHNFCSTVAL(CID_NFC_HCI,
170 NFCSTATUS_INVALID_HCI_INFORMATION);
171 }
172 else
173 {
174 switch(ps_ce_a_info->current_seq)
175 {
176 case HOST_CE_A_PIPE_OPEN:
177 {
178 status = phHciNfc_Open_Pipe( psHciContext,
179 pHwRef, ps_pipe_info );
180 if(status == NFCSTATUS_SUCCESS)
181 {
182 ps_ce_a_info->next_seq = HOST_CE_A_SAK_SEQ;
183 status = NFCSTATUS_PENDING;
184 }
185 break;
186 }
187 case HOST_CE_A_SAK_SEQ:
188 {
189 /* HOST Card Emulation A SAK Configuration */
190 ps_pipe_info->reg_index = HOST_CE_A_SAK_INDEX;
191 /* Configure the SAK of Host Card Emulation A */
192 sak = (uint8_t)HOST_CE_A_SAK_DEFAULT;
193 ps_pipe_info->param_info =(void*)&sak ;
194 ps_pipe_info->param_length = sizeof(sak) ;
195 status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
196 ps_pipe_info->pipe.pipe_id,
197 (uint8_t)ANY_SET_PARAMETER);
198 if(status == NFCSTATUS_PENDING)
199 {
200 ps_ce_a_info->next_seq = HOST_CE_A_ATQA_SEQ;
201 }
202 break;
203 }
204 case HOST_CE_A_ATQA_SEQ:
205 {
206 /* HOST Card Emulation A ATQA Configuration */
207 ps_pipe_info->reg_index = HOST_CE_A_ATQA_INDEX;
208 /* Configure the ATQA of Host Card Emulation A */
209 ps_pipe_info->param_info = (void*)atqa_info ;
210 ps_pipe_info->param_length = sizeof(atqa_info) ;
211 status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
212 ps_pipe_info->pipe.pipe_id,
213 (uint8_t)ANY_SET_PARAMETER);
214 if(status == NFCSTATUS_PENDING)
215 {
216 ps_ce_a_info->next_seq = HOST_CE_A_ENABLE_SEQ;
217 }
218 break;
219 }
220 case HOST_CE_A_ENABLE_SEQ:
221 {
222 status = phHciNfc_CE_A_Mode( psHciContext,
223 pHwRef, HOST_CE_MODE_ENABLE );
224 if(status == NFCSTATUS_PENDING)
225 {
226 ps_ce_a_info->next_seq = HOST_CE_A_DISABLE_SEQ;
227 status = NFCSTATUS_SUCCESS;
228 }
229 break;
230 }
231 default :
232 {
233 break;
234 }
235 }
236 }
237 }
238
239 return status;
240 }
241
242 NFCSTATUS
phHciNfc_CE_A_Release(phHciNfc_sContext_t * psHciContext,void * pHwRef)243 phHciNfc_CE_A_Release(
244 phHciNfc_sContext_t *psHciContext,
245 void *pHwRef
246 )
247 {
248 /*
249 1. Close pipe
250 */
251 NFCSTATUS status = NFCSTATUS_SUCCESS;
252 if ((NULL == psHciContext) || (NULL == pHwRef))
253 {
254 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
255 }
256 else if(NULL == psHciContext->p_ce_a_info)
257 {
258 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
259 }
260 else
261 {
262 phHciNfc_CE_A_Info_t *ps_ce_a_info = ((phHciNfc_CE_A_Info_t *)
263 psHciContext->p_ce_a_info );
264 phHciNfc_Pipe_Info_t *ps_pipe_info = NULL;
265
266 ps_pipe_info = ps_ce_a_info->p_pipe_info;
267 if(NULL == ps_pipe_info )
268 {
269 status = PHNFCSTVAL(CID_NFC_HCI,
270 NFCSTATUS_NOT_ALLOWED);
271 }
272 else
273 {
274 switch(ps_ce_a_info->current_seq)
275 {
276 case HOST_CE_A_DISABLE_SEQ:
277 {
278 status = phHciNfc_CE_A_Mode( psHciContext,
279 pHwRef, HOST_CE_MODE_DISABLE );
280 if(status == NFCSTATUS_PENDING)
281 {
282 ps_ce_a_info->next_seq = HOST_CE_A_PIPE_CLOSE;
283 }
284 break;
285 }
286 case HOST_CE_A_PIPE_CLOSE:
287 {
288 /* HOST Card Emulation A pipe close sequence */
289 status = phHciNfc_Close_Pipe( psHciContext,
290 pHwRef, ps_pipe_info );
291 if(status == NFCSTATUS_SUCCESS)
292 {
293 ps_ce_a_info->next_seq = HOST_CE_A_PIPE_DELETE;
294 status = NFCSTATUS_PENDING;
295 }
296 break;
297 }
298 case HOST_CE_A_PIPE_DELETE:
299 {
300 /* HOST Card Emulation A pipe delete sequence */
301 status = phHciNfc_Delete_Pipe( psHciContext,
302 pHwRef, ps_pipe_info );
303 if(status == NFCSTATUS_SUCCESS)
304 {
305 #if 0
306 ps_ce_a_info->pipe_id = HCI_UNKNOWN_PIPE_ID;
307 psHciContext->p_pipe_list[ps_ce_a_info->pipe_id] = NULL;
308 phOsalNfc_FreeMemory((void *)ps_ce_a_info->p_pipe_info);
309 ps_ce_a_info->p_pipe_info = NULL;
310 #endif
311 ps_ce_a_info->next_seq = HOST_CE_A_PIPE_OPEN;
312 }
313 break;
314 }
315 default :
316 {
317 break;
318 }
319 }
320 }
321 }
322 return status;
323 }
324
325 NFCSTATUS
phHciNfc_CE_A_Update_PipeInfo(phHciNfc_sContext_t * psHciContext,uint8_t pipeID,phHciNfc_Pipe_Info_t * pPipeInfo)326 phHciNfc_CE_A_Update_PipeInfo(
327 phHciNfc_sContext_t *psHciContext,
328 uint8_t pipeID,
329 phHciNfc_Pipe_Info_t *pPipeInfo
330 )
331 {
332 NFCSTATUS status = NFCSTATUS_SUCCESS;
333
334 if( NULL == psHciContext )
335 {
336 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
337 }
338 else if(NULL == psHciContext->p_ce_a_info)
339 {
340 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
341 }
342 else
343 {
344 phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL;
345 ps_ce_a_info = (phHciNfc_CE_A_Info_t *)
346 psHciContext->p_ce_a_info ;
347
348 ps_ce_a_info->current_seq = HOST_CE_A_PIPE_OPEN;
349 ps_ce_a_info->next_seq = HOST_CE_A_PIPE_OPEN;
350 /* Update the pipe_id of the card emulation A Gate o
351 btained from the HCI Response */
352 ps_ce_a_info->pipe_id = pipeID;
353 if (HCI_UNKNOWN_PIPE_ID != pipeID)
354 {
355 ps_ce_a_info->p_pipe_info = pPipeInfo;
356 if (NULL != pPipeInfo)
357 {
358 /* Update the Response Receive routine of the card
359 emulation A Gate */
360 pPipeInfo->recv_resp = &phHciNfc_Recv_CE_A_Response;
361 /* Update the event Receive routine of the card emulation A Gate */
362 pPipeInfo->recv_event = &phHciNfc_Recv_CE_A_Event;
363 }
364 }
365 else
366 {
367 ps_ce_a_info->p_pipe_info = NULL;
368 }
369 }
370
371 return status;
372 }
373
374 NFCSTATUS
phHciNfc_CE_A_Get_PipeID(phHciNfc_sContext_t * psHciContext,uint8_t * ppipe_id)375 phHciNfc_CE_A_Get_PipeID(
376 phHciNfc_sContext_t *psHciContext,
377 uint8_t *ppipe_id
378 )
379 {
380 NFCSTATUS status = NFCSTATUS_SUCCESS;
381
382 if( (NULL != psHciContext)
383 && ( NULL != ppipe_id )
384 && ( NULL != psHciContext->p_ce_a_info )
385 )
386 {
387 phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL;
388 ps_ce_a_info = (phHciNfc_CE_A_Info_t *)
389 psHciContext->p_ce_a_info ;
390 *ppipe_id = ps_ce_a_info->pipe_id ;
391 }
392 else
393 {
394 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
395 }
396 return status;
397 }
398
399 #ifdef CE_A_SEND_EVENT
400 NFCSTATUS
phHciNfc_CE_A_SendData_Event(void * psContext,void * pHwRef,uint8_t * pEvent,uint8_t length)401 phHciNfc_CE_A_SendData_Event(
402 void *psContext,
403 void *pHwRef,
404 uint8_t *pEvent,
405 uint8_t length
406 )
407 {
408 NFCSTATUS status = NFCSTATUS_SUCCESS;
409 phHciNfc_sContext_t *psHciContext =
410 (phHciNfc_sContext_t *)psContext ;
411 return status;
412 }
413 #endif /* #ifdef CE_A_SEND_EVENT */
414
415 static
416 NFCSTATUS
phHciNfc_Recv_CE_A_Response(void * psContext,void * pHwRef,uint8_t * pResponse,uint8_t length)417 phHciNfc_Recv_CE_A_Response(
418 void *psContext,
419 void *pHwRef,
420 uint8_t *pResponse,
421 #ifdef ONE_BYTE_LEN
422 uint8_t length
423 #else
424 uint16_t length
425 #endif
426 )
427 {
428 NFCSTATUS status = NFCSTATUS_SUCCESS;
429 phHciNfc_sContext_t *psHciContext =
430 (phHciNfc_sContext_t *)psContext ;
431 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
432 || (length == 0))
433 {
434 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
435 }
436 else if(NULL == psHciContext->p_ce_a_info)
437 {
438 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
439 }
440 else
441 {
442 phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL;
443 uint8_t prev_cmd = ANY_GET_PARAMETER;
444 ps_ce_a_info = (phHciNfc_CE_A_Info_t *)
445 psHciContext->p_ce_a_info ;
446 if( NULL == ps_ce_a_info->p_pipe_info)
447 {
448 status = PHNFCSTVAL(CID_NFC_HCI,
449 NFCSTATUS_INVALID_HCI_SEQUENCE);
450 }
451 else
452 {
453 prev_cmd = ps_ce_a_info->p_pipe_info->prev_msg ;
454 switch(prev_cmd)
455 {
456 case ANY_GET_PARAMETER:
457 {
458 #if 0
459 status = phHciNfc_CE_A_InfoUpdate(psHciContext,
460 ps_ce_a_info->p_pipe_info->reg_index,
461 &pResponse[HCP_HEADER_LEN],
462 (length - HCP_HEADER_LEN));
463 #endif /* #if 0 */
464 break;
465 }
466 case ANY_SET_PARAMETER:
467 {
468 HCI_PRINT("CE A Parameter Set \n");
469 break;
470 }
471 case ANY_OPEN_PIPE:
472 {
473 HCI_PRINT("CE A open pipe complete\n");
474 break;
475 }
476 case ANY_CLOSE_PIPE:
477 {
478 HCI_PRINT("CE A close pipe complete\n");
479 break;
480 }
481 default:
482 {
483 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
484 break;
485 }
486 }
487 if( NFCSTATUS_SUCCESS == status )
488 {
489 status = phHciNfc_CE_A_Update_Seq(psHciContext,
490 UPDATE_SEQ);
491 ps_ce_a_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;
492 }
493 }
494 }
495 return status;
496 }
497
498 NFCSTATUS
phHciNfc_CE_A_Update_Seq(phHciNfc_sContext_t * psHciContext,phHciNfc_eSeqType_t seq_type)499 phHciNfc_CE_A_Update_Seq(
500 phHciNfc_sContext_t *psHciContext,
501 phHciNfc_eSeqType_t seq_type
502 )
503 {
504 phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL;
505 NFCSTATUS status = NFCSTATUS_SUCCESS;
506
507 if( NULL == psHciContext )
508 {
509 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
510 }
511 else if( NULL == psHciContext->p_ce_a_info )
512 {
513 status = PHNFCSTVAL(CID_NFC_HCI,
514 NFCSTATUS_FEATURE_NOT_SUPPORTED);
515 }
516 else
517 {
518 ps_ce_a_info = (phHciNfc_CE_A_Info_t *)
519 psHciContext->p_ce_a_info ;
520 switch(seq_type)
521 {
522 case RESET_SEQ:
523 case INIT_SEQ:
524 {
525 ps_ce_a_info->next_seq = HOST_CE_A_PIPE_OPEN;
526 ps_ce_a_info->current_seq = HOST_CE_A_PIPE_OPEN;
527 break;
528 }
529 case UPDATE_SEQ:
530 {
531 ps_ce_a_info->current_seq = ps_ce_a_info->next_seq;
532 break;
533 }
534 case INFO_SEQ:
535 {
536 break;
537 }
538 case REL_SEQ:
539 {
540 ps_ce_a_info->next_seq = HOST_CE_A_DISABLE_SEQ;
541 ps_ce_a_info->current_seq = HOST_CE_A_DISABLE_SEQ;
542 break;
543 }
544 default:
545 {
546 break;
547 }
548 }
549 }
550 return status;
551 }
552
553
554 NFCSTATUS
phHciNfc_CE_A_Mode(void * psHciHandle,void * pHwRef,uint8_t enable_type)555 phHciNfc_CE_A_Mode(
556 void *psHciHandle,
557 void *pHwRef,
558 uint8_t enable_type
559 )
560 {
561 NFCSTATUS status = NFCSTATUS_SUCCESS;
562 static uint8_t param = 0 ;
563 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
564
565 if((NULL == psHciContext)||(NULL == pHwRef))
566 {
567 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
568 }
569 else if(NULL == psHciContext->p_ce_a_info)
570 {
571 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
572 }
573 else
574 {
575 phHciNfc_CE_A_Info_t *ps_ce_a_info = (phHciNfc_CE_A_Info_t *)
576 psHciContext->p_ce_a_info ;
577 phHciNfc_Pipe_Info_t *p_pipe_info = ps_ce_a_info->p_pipe_info;
578
579 if (NULL != p_pipe_info)
580 {
581 p_pipe_info->reg_index = HOST_CE_A_MODE_INDEX;
582 /* Enable/Disable Host Card Emulation A */
583 param = (uint8_t)enable_type;
584 p_pipe_info->param_info =(void*)¶m ;
585 p_pipe_info->param_length = sizeof(param) ;
586 status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
587 ps_ce_a_info->pipe_id,(uint8_t)ANY_SET_PARAMETER);
588 }
589 else
590 {
591 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_HCI_GATE_NOT_SUPPORTED);
592 }
593 }
594 return status;
595 }
596
597
598
599 static
600 NFCSTATUS
phHciNfc_Recv_CE_A_Event(void * psContext,void * pHwRef,uint8_t * pEvent,uint8_t length)601 phHciNfc_Recv_CE_A_Event(
602 void *psContext,
603 void *pHwRef,
604 uint8_t *pEvent,
605 #ifdef ONE_BYTE_LEN
606 uint8_t length
607 #else
608 uint16_t length
609 #endif
610 )
611 {
612 NFCSTATUS status = NFCSTATUS_SUCCESS;
613 phHciNfc_sContext_t *psHciContext =
614 (phHciNfc_sContext_t *)psContext ;
615 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
616 || (length == 0))
617 {
618 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
619 }
620 else if(NULL == psHciContext->p_ce_a_info)
621 {
622 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
623 }
624 else
625 {
626 phHciNfc_HCP_Packet_t *p_packet = NULL;
627 phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL;
628 phHciNfc_HCP_Message_t *message = NULL;
629 static phHal_sEventInfo_t event_info;
630 uint8_t instruction=0;
631
632 ps_ce_a_info = (phHciNfc_CE_A_Info_t *)
633 psHciContext->p_ce_a_info ;
634
635 /* Variable was set but never used (ARM warning) */
636 PHNFC_UNUSED_VARIABLE(ps_ce_a_info);
637
638 p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
639 message = &p_packet->msg.message;
640 /* Get the instruction bits from the Message Header */
641 instruction = (uint8_t) GET_BITS8( message->msg_header,
642 HCP_MSG_INSTRUCTION_OFFSET,
643 HCP_MSG_INSTRUCTION_LEN);
644 psHciContext->host_rf_type = phHal_eISO14443_A_PICC;
645 event_info.eventHost = phHal_eHostController;
646 event_info.eventSource = phHal_eISO14443_A_PICC;
647 switch(instruction)
648 {
649 case CE_A_EVT_NFC_ACTIVATED:
650 {
651 event_info.eventType = NFC_EVT_ACTIVATED;
652 /* Notify to the HCI Generic layer To Update the FSM */
653 break;
654 }
655 case CE_A_EVT_NFC_DEACTIVATED:
656 {
657 event_info.eventType = NFC_EVT_DEACTIVATED;
658 HCI_PRINT("CE A Target Deactivated\n");
659 break;
660 }
661 case CE_A_EVT_NFC_SEND_DATA:
662 {
663 HCI_PRINT("CE A data is received from the PN544\n");
664 #if defined (SEND_DATA_EVENT)
665 if(length > HCP_HEADER_LEN)
666 {
667 status = phHciNfc_CE_A_ProcessData(
668 psHciContext, pHwRef,
669 &pEvent[HCP_HEADER_LEN],
670 (length - HCP_HEADER_LEN));
671 }
672 else
673 {
674 status = PHNFCSTVAL(CID_NFC_HCI,
675 NFCSTATUS_INVALID_HCI_RESPONSE);
676 }
677 #endif /* #if defined (SEND_DATA_EVENT) */
678 break;
679 }
680 case CE_A_EVT_NFC_FIELD_ON:
681 {
682 HCI_PRINT("CE A field on\n");
683 event_info.eventType = NFC_EVT_FIELD_ON;
684 break;
685 }
686 case CE_A_EVT_NFC_FIELD_OFF:
687 {
688 HCI_PRINT("CE A field off\n");
689 event_info.eventType = NFC_EVT_FIELD_OFF;
690 break;
691 }
692 default:
693 {
694 status = PHNFCSTVAL(CID_NFC_HCI,
695 NFCSTATUS_INVALID_HCI_INSTRUCTION);
696 break;
697 }
698 }
699 if(NFCSTATUS_SUCCESS == status)
700 {
701 phHciNfc_Notify_Event(psHciContext, pHwRef,
702 NFC_NOTIFY_EVENT,
703 &event_info);
704 }
705 }
706 return status;
707 }
708
709 #if defined (SEND_DATA_EVENT)
710 static
711 NFCSTATUS
phHciNfc_CE_A_ProcessData(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t * pData,uint8_t length)712 phHciNfc_CE_A_ProcessData(
713 phHciNfc_sContext_t *psHciContext,
714 void *pHwRef,
715 uint8_t *pData,
716 uint8_t length
717 )
718 {
719 NFCSTATUS status = NFCSTATUS_SUCCESS;
720
721 static uint8_t send_data[] = {0x6D, 0x80};
722 status = phHciNfc_CE_A_SendData_Event(
723 (void *)psHciContext, pHwRef,
724 send_data, sizeof(send_data));
725
726 return status;
727 }
728 #endif /* #if defined (SEND_DATA_EVENT) */
729
730 #endif /* #if defined (HOST_EMULATION) */
731
732
733