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_CEA.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.13 $                                                           *
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_B.h>
48
49#define CE_B_EVT_NFC_SEND_DATA               0x10U
50#define CE_B_EVT_NFC_FIELD_ON                0x11U
51#define CE_B_EVT_NFC_DEACTIVATED             0x12U
52#define CE_B_EVT_NFC_ACTIVATED               0x13U
53#define CE_B_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_B_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_B_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_B_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_B_Init_Resources(
106                                phHciNfc_sContext_t     *psHciContext
107                         )
108{
109    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
110    phHciNfc_CE_B_Info_t        *ps_ce_b_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_b_info ) &&
119             (phHciNfc_Allocate_Resource((void **)(&ps_ce_b_info),
120            sizeof(phHciNfc_CE_B_Info_t))== NFCSTATUS_SUCCESS)
121          )
122        {
123            psHciContext->p_ce_b_info = ps_ce_b_info;
124            ps_ce_b_info->current_seq = HOST_CE_B_INVALID_SEQ;
125            ps_ce_b_info->next_seq = HOST_CE_B_INVALID_SEQ;
126            ps_ce_b_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_B_Initialise(
139                        phHciNfc_sContext_t     *psHciContext,
140                        void                    *pHwRef
141                        )
142{
143    NFCSTATUS           status = NFCSTATUS_SUCCESS;
144    static uint8_t      pupi[] = {0, 0, 0, 0};
145    static uint8_t      atqb_info[] = {0x04, 0x00};
146
147    if ((NULL == psHciContext) || (NULL == pHwRef))
148    {
149        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
150    }
151    else if(NULL == psHciContext->p_ce_b_info)
152    {
153        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
154    }
155    else
156    {
157        phHciNfc_CE_B_Info_t        *ps_ce_b_info = ((phHciNfc_CE_B_Info_t *)
158                                                psHciContext->p_ce_b_info );
159        phHciNfc_Pipe_Info_t        *ps_pipe_info = NULL;
160
161        ps_pipe_info =  ps_ce_b_info->p_pipe_info;
162        if(NULL == ps_pipe_info )
163        {
164            status = PHNFCSTVAL(CID_NFC_HCI,
165                                NFCSTATUS_INVALID_HCI_INFORMATION);
166        }
167        else
168        {
169            switch(ps_ce_b_info->current_seq)
170            {
171                case HOST_CE_B_PIPE_OPEN:
172                {
173                    status = phHciNfc_Open_Pipe( psHciContext,
174                                                pHwRef, ps_pipe_info );
175                    if(status == NFCSTATUS_SUCCESS)
176                    {
177#if defined (CE_B_CONTINUE_SEQ)
178                        ps_ce_b_info->next_seq = HOST_CE_B_PUPI_SEQ;
179#else
180                        ps_ce_b_info->next_seq = HOST_CE_B_ENABLE_SEQ;
181#endif /* #if defined (CE_CONTINUE_SEQ) */
182                        status = NFCSTATUS_PENDING;
183                    }
184                    break;
185                }
186                case HOST_CE_B_PUPI_SEQ:
187                {
188                    /* HOST Card Emulation B PUPI Configuration */
189                    ps_pipe_info->reg_index = HOST_CE_B_ATQB_INDEX;
190
191                    ps_pipe_info->param_info =(void*)&pupi ;
192                    ps_pipe_info->param_length = sizeof(pupi) ;
193                    status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
194                                                ps_pipe_info->pipe.pipe_id,
195                                                (uint8_t)ANY_SET_PARAMETER);
196                    if(status == NFCSTATUS_PENDING)
197                    {
198                        ps_ce_b_info->next_seq = HOST_CE_B_ATQB_SEQ;
199                    }
200                    break;
201                }
202                case HOST_CE_B_ATQB_SEQ:
203                {
204                    /* HOST Card Emulation B ATQB Configuration */
205                    ps_pipe_info->reg_index = HOST_CE_B_ATQB_INDEX;
206                    /* Configure the ATQA of Host Card Emulation B */
207                    ps_pipe_info->param_info = (void*)atqb_info ;
208                    ps_pipe_info->param_length = sizeof(atqb_info) ;
209                    status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
210                                                ps_pipe_info->pipe.pipe_id,
211                                                (uint8_t)ANY_SET_PARAMETER);
212                    if(status == NFCSTATUS_PENDING)
213                    {
214                        ps_ce_b_info->next_seq = HOST_CE_B_ENABLE_SEQ;
215                    }
216                    break;
217                }
218                case HOST_CE_B_ENABLE_SEQ:
219                {
220                    status = phHciNfc_CE_B_Mode( psHciContext,
221                                            pHwRef, HOST_CE_MODE_ENABLE );
222                    if(status == NFCSTATUS_PENDING)
223                    {
224                        ps_ce_b_info->next_seq = HOST_CE_B_DISABLE_SEQ;
225                        status = NFCSTATUS_SUCCESS;
226                    }
227                    break;
228                }
229                default :
230                {
231                    break;
232                }
233            }
234        }
235    }
236
237    return status;
238}
239
240NFCSTATUS
241phHciNfc_CE_B_Release(
242                        phHciNfc_sContext_t     *psHciContext,
243                        void                    *pHwRef
244                        )
245{
246    NFCSTATUS       status = NFCSTATUS_SUCCESS;
247    if ((NULL == psHciContext) || (NULL == pHwRef))
248    {
249        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
250    }
251    else if(NULL == psHciContext->p_ce_b_info)
252    {
253        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
254    }
255    else
256    {
257        phHciNfc_CE_B_Info_t        *ps_ce_b_info = ((phHciNfc_CE_B_Info_t *)
258                                                psHciContext->p_ce_b_info );
259        phHciNfc_Pipe_Info_t        *ps_pipe_info = NULL;
260
261        ps_pipe_info =  ps_ce_b_info->p_pipe_info;
262        if(NULL == ps_pipe_info )
263        {
264            status = PHNFCSTVAL(CID_NFC_HCI,
265                                NFCSTATUS_INVALID_HCI_INFORMATION);
266        }
267        else
268        {
269            switch(ps_ce_b_info->current_seq)
270            {
271                case HOST_CE_B_DISABLE_SEQ:
272                {
273                    status = phHciNfc_CE_B_Mode( psHciContext,
274                                            pHwRef,  HOST_CE_MODE_DISABLE );
275                    if(status == NFCSTATUS_PENDING)
276                    {
277                        ps_ce_b_info->next_seq = HOST_CE_B_PIPE_CLOSE;
278                    }
279                    break;
280                }
281                case HOST_CE_B_PIPE_CLOSE:
282                {
283                    /* HOST Card Emulation B pipe close sequence */
284                    status = phHciNfc_Close_Pipe( psHciContext,
285                                                pHwRef, ps_pipe_info );
286                    if(status == NFCSTATUS_SUCCESS)
287                    {
288                        ps_ce_b_info->next_seq = HOST_CE_B_PIPE_DELETE;
289                        status = NFCSTATUS_PENDING;
290                    }
291                    break;
292                }
293                case HOST_CE_B_PIPE_DELETE:
294                {
295                    /* HOST Card Emulation A pipe delete sequence */
296                    status = phHciNfc_Delete_Pipe( psHciContext,
297                                                pHwRef, ps_pipe_info );
298                    if(status == NFCSTATUS_SUCCESS)
299                    {
300#if 0
301                        ps_ce_b_info->pipe_id = HCI_UNKNOWN_PIPE_ID;
302                        psHciContext->p_pipe_list[ps_ce_b_info->pipe_id] = NULL;
303                        phOsalNfc_FreeMemory((void *)ps_ce_b_info->p_pipe_info);
304                        ps_ce_b_info->p_pipe_info = NULL;
305#endif
306                        ps_ce_b_info->next_seq = HOST_CE_B_PIPE_OPEN;
307                    }
308                    break;
309                }
310                default :
311                {
312                    break;
313                }
314            }
315        }
316    }
317    return status;
318}
319
320
321
322NFCSTATUS
323phHciNfc_CE_B_Mode(
324                            void        *psHciHandle,
325                            void        *pHwRef,
326                            uint8_t     enable_type
327                  )
328{
329    NFCSTATUS               status = NFCSTATUS_SUCCESS;
330    static uint8_t          param = 0 ;
331    phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
332
333    if((NULL == psHciContext)||(NULL == pHwRef))
334    {
335        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
336    }
337    else if(NULL == psHciContext->p_ce_b_info)
338    {
339        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
340    }
341    else
342    {
343        phHciNfc_CE_B_Info_t     *ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
344                                                psHciContext->p_ce_b_info ;
345        phHciNfc_Pipe_Info_t     *ps_pipe_info = ps_ce_b_info->p_pipe_info;
346
347        if (NULL != ps_pipe_info)
348        {
349            ps_pipe_info->reg_index = HOST_CE_B_MODE_INDEX;
350            /* Enable/Disable Host Card Emulation A */
351            param = (uint8_t)enable_type;
352            ps_pipe_info->param_info =(void*)&param ;
353            ps_pipe_info->param_length = sizeof(param) ;
354            status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
355                                    ps_ce_b_info->pipe_id,(uint8_t)ANY_SET_PARAMETER);
356        }
357        else
358        {
359            status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_HCI_GATE_NOT_SUPPORTED);
360        }
361    }
362    return status;
363}
364
365
366
367NFCSTATUS
368phHciNfc_CE_B_Get_PipeID(
369                             phHciNfc_sContext_t        *psHciContext,
370                             uint8_t                    *ppipe_id
371                             )
372{
373    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
374
375    if( (NULL != psHciContext)
376        && ( NULL != ppipe_id )
377        && ( NULL != psHciContext->p_ce_b_info )
378        )
379    {
380        phHciNfc_CE_B_Info_t     *ps_ce_b_info=NULL;
381        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
382                        psHciContext->p_ce_b_info ;
383        *ppipe_id =  ps_ce_b_info->pipe_id  ;
384    }
385    else
386    {
387        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
388    }
389    return status;
390}
391
392NFCSTATUS
393phHciNfc_CE_B_Update_PipeInfo(
394                                  phHciNfc_sContext_t     *psHciContext,
395                                  uint8_t                 pipeID,
396                                  phHciNfc_Pipe_Info_t    *pPipeInfo
397                                  )
398{
399    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
400
401    if( NULL == psHciContext )
402    {
403        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
404    }
405    else if(NULL == psHciContext->p_ce_b_info)
406    {
407        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
408    }
409    else
410    {
411        phHciNfc_CE_B_Info_t         *ps_ce_b_info=NULL;
412        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
413                        psHciContext->p_ce_b_info ;
414
415        ps_ce_b_info->current_seq = HOST_CE_B_PIPE_OPEN;
416        ps_ce_b_info->next_seq = HOST_CE_B_PIPE_OPEN;
417        /* Update the pipe_id of the card emulation A Gate o
418            btained from the HCI Response */
419        ps_ce_b_info->pipe_id = pipeID;
420        if (HCI_UNKNOWN_PIPE_ID != pipeID)
421        {
422            ps_ce_b_info->p_pipe_info = pPipeInfo;
423            if (NULL != pPipeInfo)
424            {
425                /* Update the Response Receive routine of the card
426                    emulation A Gate */
427                pPipeInfo->recv_resp = &phHciNfc_Recv_CE_B_Response;
428                /* Update the event Receive routine of the card emulation A Gate */
429                pPipeInfo->recv_event = &phHciNfc_Recv_CE_B_Event;
430            }
431        }
432        else
433        {
434            ps_ce_b_info->p_pipe_info = NULL;
435        }
436    }
437
438    return status;
439}
440
441#ifdef CE_B_SEND_EVENT
442NFCSTATUS
443phHciNfc_CE_B_SendData_Event(
444                             void               *psContext,
445                             void               *pHwRef,
446                             uint8_t            *pEvent,
447                             uint8_t            length
448                       )
449{
450    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
451    phHciNfc_sContext_t         *psHciContext =
452                                (phHciNfc_sContext_t *)psContext ;
453    return status;
454}
455#endif /* #ifdef CE_B_SEND_EVENT */
456
457static
458NFCSTATUS
459phHciNfc_Recv_CE_B_Response(
460                             void               *psContext,
461                             void               *pHwRef,
462                             uint8_t            *pResponse,
463#ifdef ONE_BYTE_LEN
464                             uint8_t            length
465#else
466                             uint16_t           length
467#endif
468                       )
469{
470    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
471    phHciNfc_sContext_t         *psHciContext =
472                                (phHciNfc_sContext_t *)psContext ;
473    if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
474        || (length == 0))
475    {
476        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
477    }
478    else if(NULL == psHciContext->p_ce_b_info)
479    {
480        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
481    }
482    else
483    {
484        phHciNfc_CE_B_Info_t         *ps_ce_b_info=NULL;
485        uint8_t                     prev_cmd = ANY_GET_PARAMETER;
486        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
487                            psHciContext->p_ce_b_info ;
488        if( NULL == ps_ce_b_info->p_pipe_info)
489        {
490            status = PHNFCSTVAL(CID_NFC_HCI,
491                            NFCSTATUS_INVALID_HCI_SEQUENCE);
492        }
493        else
494        {
495            prev_cmd = ps_ce_b_info->p_pipe_info->prev_msg ;
496            switch(prev_cmd)
497            {
498                case ANY_GET_PARAMETER:
499                {
500#if 0
501                    status = phHciNfc_CE_B_InfoUpdate(psHciContext,
502                                    ps_ce_b_info->p_pipe_info->reg_index,
503                                    &pResponse[HCP_HEADER_LEN],
504                                    (length - HCP_HEADER_LEN));
505#endif /* #if 0 */
506                    break;
507                }
508                case ANY_SET_PARAMETER:
509                {
510                    HCI_PRINT("CE B Parameter Set \n");
511                    break;
512                }
513                case ANY_OPEN_PIPE:
514                {
515                    HCI_PRINT("CE B open pipe complete\n");
516                    break;
517                }
518                case ANY_CLOSE_PIPE:
519                {
520                    HCI_PRINT("CE B close pipe complete\n");
521                    break;
522                }
523                default:
524                {
525                    status = PHNFCSTVAL(CID_NFC_HCI,
526                                        NFCSTATUS_INVALID_HCI_RESPONSE);
527                    break;
528                }
529            }
530            if( NFCSTATUS_SUCCESS == status )
531            {
532                status = phHciNfc_CE_B_Update_Seq(psHciContext,
533                                                    UPDATE_SEQ);
534                ps_ce_b_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;
535            }
536        }
537    }
538    return status;
539}
540
541NFCSTATUS
542phHciNfc_CE_B_Update_Seq(
543                        phHciNfc_sContext_t     *psHciContext,
544                        phHciNfc_eSeqType_t     seq_type
545                    )
546{
547    phHciNfc_CE_B_Info_t    *ps_ce_b_info=NULL;
548    NFCSTATUS               status = NFCSTATUS_SUCCESS;
549
550    if( NULL == psHciContext )
551    {
552        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
553    }
554    else if( NULL == psHciContext->p_ce_b_info )
555    {
556        status = PHNFCSTVAL(CID_NFC_HCI,
557                            NFCSTATUS_FEATURE_NOT_SUPPORTED);
558    }
559    else
560    {
561        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
562                        psHciContext->p_ce_b_info ;
563        switch(seq_type)
564        {
565            case RESET_SEQ:
566            case INIT_SEQ:
567            {
568                ps_ce_b_info->next_seq = HOST_CE_B_PIPE_OPEN;
569                ps_ce_b_info->current_seq = HOST_CE_B_PIPE_OPEN;
570                break;
571            }
572            case UPDATE_SEQ:
573            {
574                ps_ce_b_info->current_seq = ps_ce_b_info->next_seq;
575                break;
576            }
577            case INFO_SEQ:
578            {
579                break;
580            }
581            case REL_SEQ:
582            {
583                ps_ce_b_info->next_seq = HOST_CE_B_DISABLE_SEQ;
584                ps_ce_b_info->current_seq = HOST_CE_B_DISABLE_SEQ;
585                break;
586            }
587            default:
588            {
589                break;
590            }
591        }
592    }
593    return status;
594}
595
596
597static
598NFCSTATUS
599phHciNfc_Recv_CE_B_Event(
600                             void               *psContext,
601                             void               *pHwRef,
602                             uint8_t            *pEvent,
603#ifdef ONE_BYTE_LEN
604                             uint8_t            length
605#else
606                             uint16_t           length
607#endif
608                       )
609{
610    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
611    phHciNfc_sContext_t         *psHciContext =
612                                (phHciNfc_sContext_t *)psContext ;
613    if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
614        || (length == 0))
615    {
616        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
617    }
618    else if(NULL == psHciContext->p_ce_b_info)
619    {
620        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
621    }
622    else
623    {
624        phHciNfc_HCP_Packet_t       *p_packet = NULL;
625        phHciNfc_CE_B_Info_t         *ps_ce_b_info=NULL;
626        phHciNfc_HCP_Message_t      *message = NULL;
627        static phHal_sEventInfo_t   event_info;
628        uint8_t                     instruction=0;
629
630        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
631                        psHciContext->p_ce_b_info ;
632
633        /* Variable was set but never used (ARM warning) */
634        PHNFC_UNUSED_VARIABLE(ps_ce_b_info);
635
636        p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
637        message = &p_packet->msg.message;
638        /* Get the instruction bits from the Message Header */
639        instruction = (uint8_t) GET_BITS8( message->msg_header,
640                                HCP_MSG_INSTRUCTION_OFFSET,
641                                HCP_MSG_INSTRUCTION_LEN);
642        psHciContext->host_rf_type = phHal_eISO14443_B_PICC;
643        event_info.eventHost = phHal_eHostController;
644        event_info.eventSource = phHal_eISO14443_B_PICC;
645        switch(instruction)
646        {
647            case CE_B_EVT_NFC_ACTIVATED:
648            {
649                event_info.eventType = NFC_EVT_ACTIVATED;
650                /* Notify to the HCI Generic layer To Update the FSM */
651                break;
652            }
653            case CE_B_EVT_NFC_DEACTIVATED:
654            {
655                event_info.eventType = NFC_EVT_DEACTIVATED;
656                HCI_PRINT("CE B Target Deactivated\n");
657                break;
658            }
659            case CE_B_EVT_NFC_SEND_DATA:
660            {
661#if defined (SEND_DATA_EVENT)
662                HCI_PRINT("CE B data is received from the PN544\n");
663                if(length > HCP_HEADER_LEN)
664                {
665                    status = phHciNfc_CE_B_ProcessData(
666                                            psHciContext, pHwRef,
667                                            &pEvent[HCP_HEADER_LEN],
668                                            (length - HCP_HEADER_LEN));
669                }
670                else
671                {
672                    status = PHNFCSTVAL(CID_NFC_HCI,
673                                        NFCSTATUS_INVALID_HCI_RESPONSE);
674                }
675#endif /* #if defined (SEND_DATA_EVENT) */
676                break;
677            }
678            case CE_B_EVT_NFC_FIELD_ON:
679            {
680                HCI_PRINT("CE B field on\n");
681                event_info.eventType = NFC_EVT_FIELD_ON;
682                break;
683            }
684            case CE_B_EVT_NFC_FIELD_OFF:
685            {
686                HCI_PRINT("CE B field off\n");
687                event_info.eventType = NFC_EVT_FIELD_OFF;
688                break;
689            }
690            default:
691            {
692                status = PHNFCSTVAL(CID_NFC_HCI,
693                                    NFCSTATUS_INVALID_HCI_INSTRUCTION);
694                break;
695            }
696        }
697        if(NFCSTATUS_SUCCESS == status)
698        {
699            phHciNfc_Notify_Event(psHciContext, pHwRef,
700                                    NFC_NOTIFY_EVENT,
701                                    &event_info);
702        }
703    }
704    return status;
705}
706
707#if defined (SEND_DATA_EVENT)
708static
709NFCSTATUS
710phHciNfc_CE_B_ProcessData(
711                            phHciNfc_sContext_t     *psHciContext,
712                            void                    *pHwRef,
713                            uint8_t                 *pData,
714                            uint8_t                 length
715                       )
716{
717    NFCSTATUS       status = NFCSTATUS_SUCCESS;
718
719    static uint8_t  send_data[] = {0x6D, 0x80};
720    status = phHciNfc_CE_B_SendData_Event(
721                             (void *)psHciContext, pHwRef,
722                             send_data, sizeof(send_data));
723    return status;
724}
725
726#endif /* #if defined (SEND_DATA_EVENT) */
727
728#endif /* #if defined (HOST_EMULATION) */
729
730