15d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
25d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Copyright (C) 2010 NXP Semiconductors
35d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
45d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
55d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * you may not use this file except in compliance with the License.
65d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * You may obtain a copy of the License at
75d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
85d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
95d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Unless required by applicable law or agreed to in writing, software
115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * See the License for the specific language governing permissions and
145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * limitations under the License.
155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* =========================================================================== *
195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \file  phHciNfc_CEA.c                                                       *
225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief HCI card emulation A management routines.                            *
235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Project: NFC-FRI-1.1                                                        *
265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Date: Fri Aug 21 18:35:05 2009 $                                           *
285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Author: ing04880 $                                                         *
295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Revision: 1.13 $                                                           *
305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $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 $
315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* =========================================================================== *
335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly***************************** Header File Inclusion ****************************
375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcCompId.h>
395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcHalTypes.h>
405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_Pipe.h>
415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_Emulation.h>
425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phOsalNfc.h>
435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly****************************** Macro Definitions *******************************
455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined (HOST_EMULATION)
475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_CE_B.h>
485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_B_EVT_NFC_SEND_DATA               0x10U
505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_B_EVT_NFC_FIELD_ON                0x11U
515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_B_EVT_NFC_DEACTIVATED             0x12U
525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_B_EVT_NFC_ACTIVATED               0x13U
535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_B_EVT_NFC_FIELD_OFF               0x14U
545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Structure and Enumeration ***************************
575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Static Function Declaration **************************
625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_CE_B_Event(
675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *psContext,
685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *pHwRef,
695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            *pEvent,
705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            length
725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint16_t           length
745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                       );
765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_CE_B_Response(
805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *psContext,
815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *pHwRef,
825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            *pResponse,
835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            length
855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint16_t           length
875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                       );
895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined (SEND_DATA_EVENT)
915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_ProcessData(
945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            phHciNfc_sContext_t     *psHciContext,
955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            void                    *pHwRef,
965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 *pData,
975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 length
985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                       );
995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if defined (SEND_DATA_EVENT) */
1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Function Definitions ***************************
1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_Init_Resources(
1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_sContext_t     *psHciContext
1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         )
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_CE_B_Info_t        *ps_ce_b_info = NULL;
1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( NULL == psHciContext )
1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(
1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ( NULL == psHciContext->p_ce_b_info ) &&
1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             (phHciNfc_Allocate_Resource((void **)(&ps_ce_b_info),
1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            sizeof(phHciNfc_CE_B_Info_t))== NFCSTATUS_SUCCESS)
1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly          )
1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            psHciContext->p_ce_b_info = ps_ce_b_info;
1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_ce_b_info->current_seq = HOST_CE_B_INVALID_SEQ;
1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_ce_b_info->next_seq = HOST_CE_B_INVALID_SEQ;
1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_ce_b_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_Initialise(
1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phHciNfc_sContext_t     *psHciContext,
1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                    *pHwRef
1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        )
1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS           status = NFCSTATUS_SUCCESS;
1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    static uint8_t      pupi[] = {0, 0, 0, 0};
1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    static uint8_t      atqb_info[] = {0x04, 0x00};
1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ((NULL == psHciContext) || (NULL == pHwRef))
1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL == psHciContext->p_ce_b_info)
1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_CE_B_Info_t        *ps_ce_b_info = ((phHciNfc_CE_B_Info_t *)
1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                psHciContext->p_ce_b_info );
1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Pipe_Info_t        *ps_pipe_info = NULL;
1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_pipe_info =  ps_ce_b_info->p_pipe_info;
1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL == ps_pipe_info )
1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI,
1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_INVALID_HCI_INFORMATION);
1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            switch(ps_ce_b_info->current_seq)
1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case HOST_CE_B_PIPE_OPEN:
1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Open_Pipe( psHciContext,
1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                pHwRef, ps_pipe_info );
1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_SUCCESS)
1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined (CE_B_CONTINUE_SEQ)
1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->next_seq = HOST_CE_B_PUPI_SEQ;
1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->next_seq = HOST_CE_B_ENABLE_SEQ;
1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if defined (CE_CONTINUE_SEQ) */
1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = NFCSTATUS_PENDING;
1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case HOST_CE_B_PUPI_SEQ:
1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* HOST Card Emulation B PUPI Configuration */
1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->reg_index = HOST_CE_B_ATQB_INDEX;
1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->param_info =(void*)&pupi ;
1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->param_length = sizeof(pupi) ;
1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                ps_pipe_info->pipe.pipe_id,
1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                (uint8_t)ANY_SET_PARAMETER);
1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_PENDING)
1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->next_seq = HOST_CE_B_ATQB_SEQ;
1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case HOST_CE_B_ATQB_SEQ:
2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* HOST Card Emulation B ATQB Configuration */
2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->reg_index = HOST_CE_B_ATQB_INDEX;
2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Configure the ATQA of Host Card Emulation B */
2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->param_info = (void*)atqb_info ;
2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->param_length = sizeof(atqb_info) ;
2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                ps_pipe_info->pipe.pipe_id,
2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                (uint8_t)ANY_SET_PARAMETER);
2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_PENDING)
2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->next_seq = HOST_CE_B_ENABLE_SEQ;
2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case HOST_CE_B_ENABLE_SEQ:
2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_CE_B_Mode( psHciContext,
2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            pHwRef, HOST_CE_MODE_ENABLE );
2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_PENDING)
2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->next_seq = HOST_CE_B_DISABLE_SEQ;
2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = NFCSTATUS_SUCCESS;
2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                default :
2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_Release(
2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phHciNfc_sContext_t     *psHciContext,
2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                    *pHwRef
2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        )
2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS       status = NFCSTATUS_SUCCESS;
2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ((NULL == psHciContext) || (NULL == pHwRef))
2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL == psHciContext->p_ce_b_info)
2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_CE_B_Info_t        *ps_ce_b_info = ((phHciNfc_CE_B_Info_t *)
2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                psHciContext->p_ce_b_info );
2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Pipe_Info_t        *ps_pipe_info = NULL;
2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_pipe_info =  ps_ce_b_info->p_pipe_info;
2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL == ps_pipe_info )
2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI,
2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_INVALID_HCI_INFORMATION);
2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            switch(ps_ce_b_info->current_seq)
2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case HOST_CE_B_DISABLE_SEQ:
2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_CE_B_Mode( psHciContext,
2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            pHwRef,  HOST_CE_MODE_DISABLE );
2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_PENDING)
2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->next_seq = HOST_CE_B_PIPE_CLOSE;
2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case HOST_CE_B_PIPE_CLOSE:
2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* HOST Card Emulation B pipe close sequence */
2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Close_Pipe( psHciContext,
2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                pHwRef, ps_pipe_info );
2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_SUCCESS)
2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->next_seq = HOST_CE_B_PIPE_DELETE;
2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = NFCSTATUS_PENDING;
2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case HOST_CE_B_PIPE_DELETE:
2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* HOST Card Emulation A pipe delete sequence */
2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Delete_Pipe( psHciContext,
2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                pHwRef, ps_pipe_info );
2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_SUCCESS)
2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if 0
3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->pipe_id = HCI_UNKNOWN_PIPE_ID;
3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_pipe_list[ps_ce_b_info->pipe_id] = NULL;
3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phOsalNfc_FreeMemory((void *)ps_ce_b_info->p_pipe_info);
3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->p_pipe_info = NULL;
3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_ce_b_info->next_seq = HOST_CE_B_PIPE_OPEN;
3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                default :
3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_Mode(
3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            void        *psHciHandle,
3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            void        *pHwRef,
3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t     enable_type
3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                  )
3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS               status = NFCSTATUS_SUCCESS;
3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    static uint8_t          param = 0 ;
3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if((NULL == psHciContext)||(NULL == pHwRef))
3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL == psHciContext->p_ce_b_info)
3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_CE_B_Info_t     *ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                psHciContext->p_ce_b_info ;
3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Pipe_Info_t     *ps_pipe_info = ps_ce_b_info->p_pipe_info;
3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if (NULL != ps_pipe_info)
3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_pipe_info->reg_index = HOST_CE_B_MODE_INDEX;
3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Enable/Disable Host Card Emulation A */
3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            param = (uint8_t)enable_type;
3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_pipe_info->param_info =(void*)&param ;
3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_pipe_info->param_length = sizeof(param) ;
3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef,
3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    ps_ce_b_info->pipe_id,(uint8_t)ANY_SET_PARAMETER);
3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_HCI_GATE_NOT_SUPPORTED);
3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_Get_PipeID(
3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             phHciNfc_sContext_t        *psHciContext,
3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t                    *ppipe_id
3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             )
3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL != psHciContext)
3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        && ( NULL != ppipe_id )
3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        && ( NULL != psHciContext->p_ce_b_info )
3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        )
3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_CE_B_Info_t     *ps_ce_b_info=NULL;
3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_ce_b_info ;
3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        *ppipe_id =  ps_ce_b_info->pipe_id  ;
3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_Update_PipeInfo(
3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                  phHciNfc_sContext_t     *psHciContext,
3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                  uint8_t                 pipeID,
3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                  phHciNfc_Pipe_Info_t    *pPipeInfo
3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                  )
3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( NULL == psHciContext )
4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL == psHciContext->p_ce_b_info)
4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_CE_B_Info_t         *ps_ce_b_info=NULL;
4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_ce_b_info ;
4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_ce_b_info->current_seq = HOST_CE_B_PIPE_OPEN;
4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_ce_b_info->next_seq = HOST_CE_B_PIPE_OPEN;
4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Update the pipe_id of the card emulation A Gate o
4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            btained from the HCI Response */
4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_ce_b_info->pipe_id = pipeID;
4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if (HCI_UNKNOWN_PIPE_ID != pipeID)
4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_ce_b_info->p_pipe_info = pPipeInfo;
4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (NULL != pPipeInfo)
4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Update the Response Receive routine of the card
4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    emulation A Gate */
4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pPipeInfo->recv_resp = &phHciNfc_Recv_CE_B_Response;
4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Update the event Receive routine of the card emulation A Gate */
4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pPipeInfo->recv_event = &phHciNfc_Recv_CE_B_Event;
4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_ce_b_info->p_pipe_info = NULL;
4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef CE_B_SEND_EVENT
4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_SendData_Event(
4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *psContext,
4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *pHwRef,
4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            *pEvent,
4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            length
4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                       )
4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t         *psHciContext =
4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (phHciNfc_sContext_t *)psContext ;
4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef CE_B_SEND_EVENT */
4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_CE_B_Response(
4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *psContext,
4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *pHwRef,
4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            *pResponse,
4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            length
4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint16_t           length
4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                       )
4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t         *psHciContext =
4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (phHciNfc_sContext_t *)psContext ;
4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (length == 0))
4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL == psHciContext->p_ce_b_info)
4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_CE_B_Info_t         *ps_ce_b_info=NULL;
4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        uint8_t                     prev_cmd = ANY_GET_PARAMETER;
4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            psHciContext->p_ce_b_info ;
4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( NULL == ps_ce_b_info->p_pipe_info)
4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI,
4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NFCSTATUS_INVALID_HCI_SEQUENCE);
4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            prev_cmd = ps_ce_b_info->p_pipe_info->prev_msg ;
4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            switch(prev_cmd)
4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_GET_PARAMETER:
4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if 0
5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_CE_B_InfoUpdate(psHciContext,
5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    ps_ce_b_info->p_pipe_info->reg_index,
5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    &pResponse[HCP_HEADER_LEN],
5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (length - HCP_HEADER_LEN));
5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if 0 */
5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_SET_PARAMETER:
5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("CE B Parameter Set \n");
5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_OPEN_PIPE:
5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("CE B open pipe complete\n");
5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_CLOSE_PIPE:
5195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("CE B close pipe complete\n");
5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                default:
5245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = PHNFCSTVAL(CID_NFC_HCI,
5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_INVALID_HCI_RESPONSE);
5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if( NFCSTATUS_SUCCESS == status )
5315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = phHciNfc_CE_B_Update_Seq(psHciContext,
5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    UPDATE_SEQ);
5345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_ce_b_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;
5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
5385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
5395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
5405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
5425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_Update_Seq(
5435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phHciNfc_sContext_t     *psHciContext,
5445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phHciNfc_eSeqType_t     seq_type
5455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    )
5465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
5475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_CE_B_Info_t    *ps_ce_b_info=NULL;
5485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS               status = NFCSTATUS_SUCCESS;
5495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( NULL == psHciContext )
5515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
5525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
5535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
5545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if( NULL == psHciContext->p_ce_b_info )
5555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
5565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI,
5575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NFCSTATUS_FEATURE_NOT_SUPPORTED);
5585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
5615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
5625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_ce_b_info ;
5635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch(seq_type)
5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case RESET_SEQ:
5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case INIT_SEQ:
5675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_ce_b_info->next_seq = HOST_CE_B_PIPE_OPEN;
5695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_ce_b_info->current_seq = HOST_CE_B_PIPE_OPEN;
5705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case UPDATE_SEQ:
5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_ce_b_info->current_seq = ps_ce_b_info->next_seq;
5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case INFO_SEQ:
5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case REL_SEQ:
5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_ce_b_info->next_seq = HOST_CE_B_DISABLE_SEQ;
5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_ce_b_info->current_seq = HOST_CE_B_DISABLE_SEQ;
5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            default:
5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_CE_B_Event(
6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *psContext,
6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void               *pHwRef,
6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            *pEvent,
6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t            length
6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint16_t           length
6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                       )
6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t         *psHciContext =
6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (phHciNfc_sContext_t *)psContext ;
6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (length == 0))
6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL == psHciContext->p_ce_b_info)
6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_HCP_Packet_t       *p_packet = NULL;
6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_CE_B_Info_t         *ps_ce_b_info=NULL;
6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_HCP_Message_t      *message = NULL;
6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        static phHal_sEventInfo_t   event_info;
6285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        uint8_t                     instruction=0;
6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_ce_b_info = (phHciNfc_CE_B_Info_t *)
6315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_ce_b_info ;
6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Variable was set but never used (ARM warning) */
6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        PHNFC_UNUSED_VARIABLE(ps_ce_b_info);
6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        message = &p_packet->msg.message;
6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Get the instruction bits from the Message Header */
6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        instruction = (uint8_t) GET_BITS8( message->msg_header,
6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                HCP_MSG_INSTRUCTION_OFFSET,
6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                HCP_MSG_INSTRUCTION_LEN);
6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        psHciContext->host_rf_type = phHal_eISO14443_B_PICC;
6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        event_info.eventHost = phHal_eHostController;
6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        event_info.eventSource = phHal_eISO14443_B_PICC;
6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch(instruction)
6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case CE_B_EVT_NFC_ACTIVATED:
6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                event_info.eventType = NFC_EVT_ACTIVATED;
6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Notify to the HCI Generic layer To Update the FSM */
6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case CE_B_EVT_NFC_DEACTIVATED:
6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                event_info.eventType = NFC_EVT_DEACTIVATED;
6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                HCI_PRINT("CE B Target Deactivated\n");
6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case CE_B_EVT_NFC_SEND_DATA:
6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined (SEND_DATA_EVENT)
6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                HCI_PRINT("CE B data is received from the PN544\n");
6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(length > HCP_HEADER_LEN)
6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_CE_B_ProcessData(
6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            psHciContext, pHwRef,
6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            &pEvent[HCP_HEADER_LEN],
6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            (length - HCP_HEADER_LEN));
6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = PHNFCSTVAL(CID_NFC_HCI,
6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_INVALID_HCI_RESPONSE);
6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if defined (SEND_DATA_EVENT) */
6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case CE_B_EVT_NFC_FIELD_ON:
6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                HCI_PRINT("CE B field on\n");
6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                event_info.eventType = NFC_EVT_FIELD_ON;
6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case CE_B_EVT_NFC_FIELD_OFF:
6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                HCI_PRINT("CE B field off\n");
6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                event_info.eventType = NFC_EVT_FIELD_OFF;
6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            default:
6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = PHNFCSTVAL(CID_NFC_HCI,
6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NFCSTATUS_INVALID_HCI_INSTRUCTION);
6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NFCSTATUS_SUCCESS == status)
6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phHciNfc_Notify_Event(psHciContext, pHwRef,
7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NFC_NOTIFY_EVENT,
7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    &event_info);
7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined (SEND_DATA_EVENT)
7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_B_ProcessData(
7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            phHciNfc_sContext_t     *psHciContext,
7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            void                    *pHwRef,
7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 *pData,
7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 length
7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                       )
7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS       status = NFCSTATUS_SUCCESS;
7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    static uint8_t  send_data[] = {0x6D, 0x80};
7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status = phHciNfc_CE_B_SendData_Event(
7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             (void *)psHciContext, pHwRef,
7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             send_data, sizeof(send_data));
7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if defined (SEND_DATA_EVENT) */
7275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if defined (HOST_EMULATION) */
7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
730