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*)&param ;
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