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
64static
65NFCSTATUS
66phHciNfc_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
77static
78NFCSTATUS
79phHciNfc_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)
91static
92NFCSTATUS
93phHciNfc_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*/
104NFCSTATUS
105phHciNfc_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
137NFCSTATUS
138phHciNfc_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
242NFCSTATUS
243phHciNfc_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
325NFCSTATUS
326phHciNfc_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
374NFCSTATUS
375phHciNfc_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
400NFCSTATUS
401phHciNfc_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
415static
416NFCSTATUS
417phHciNfc_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
498NFCSTATUS
499phHciNfc_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
554NFCSTATUS
555phHciNfc_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
599static
600NFCSTATUS
601phHciNfc_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)
710static
711NFCSTATUS
712phHciNfc_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