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_Jewel.c                                                 *
225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief HCI Jewel/Topaz Management Routines.                                    *
235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Project: NFC-FRI-1.1                                                        *
265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Date: Mon Mar 29 17:34:47 2010 $                                           *
285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Author: ing04880 $                                                         *
295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Revision: 1.8 $                                                           *
305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Aliases: 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 <phHciNfc_Pipe.h>
405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_RFReader.h>
415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phOsalNfc.h>
425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined(TYPE_JEWEL)
445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_Jewel.h>
455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly****************************** Macro Definitions *******************************
485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define JEWEL_SINGLE_TAG_FOUND              0x00U
505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define JEWEL_MULTIPLE_TAGS_FOUND           0x03U
515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define NXP_WRA_CONTINUE_ACTIVATION         0x12U
525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define NXP_JEWEL_READID                    0x78U
545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define NXP_JEWEL_READID_LENGTH             0x06U
555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Structure and Enumeration ***************************
585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Static Function Declaration **************************
625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_Jewel_Response(
675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               void                *psContext,
685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               void                *pHwRef,
695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               uint8_t             *pResponse,
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_Jewel_Event(
805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            void               *psContext,
815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            void               *pHwRef,
825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t            *pEvent,
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 Pellystatic
915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Jewel_InfoUpdate(
935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            phHciNfc_sContext_t     *psHciContext,
945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 index,
955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 *reg_value,
965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 reg_length
975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            );
985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_Jewel_Packet(
1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            phHciNfc_sContext_t  *psHciContext,
1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t              *pResponse,
1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t             length
1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint16_t            length
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            );
1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Jewel_Get_PipeID(
1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                           phHciNfc_sContext_t     *psHciContext,
1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                           uint8_t                 *ppipe_id
1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                           )
1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL != psHciContext)
1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        && ( NULL != ppipe_id )
1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        && ( NULL != psHciContext->p_jewel_info )
1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        )
1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Jewel_Info_t     *ps_jewel_info = NULL;
1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info = (phHciNfc_Jewel_Info_t *)psHciContext->p_jewel_info;
1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        *ppipe_id =  ps_jewel_info->pipe_id;
1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Jewel_Init_Resources(
1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               phHciNfc_sContext_t     *psHciContext
1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               )
1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Jewel_Info_t      *ps_jewel_info = NULL;
1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( NULL == psHciContext )
1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(
1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ( NULL == psHciContext->p_jewel_info ) &&
1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (phHciNfc_Allocate_Resource((void **)(&ps_jewel_info),
1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            sizeof(phHciNfc_Jewel_Info_t))== NFCSTATUS_SUCCESS)
1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            )
1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            psHciContext->p_jewel_info = ps_jewel_info;
1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_jewel_info->current_seq = JEWEL_INVALID_SEQ;
1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_jewel_info->next_seq = JEWEL_INVALID_SEQ;
1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_jewel_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Jewel_Update_PipeInfo(
1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_sContext_t     *psHciContext,
1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                uint8_t                 pipeID,
1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_Pipe_Info_t    *pPipeInfo
1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                )
1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( NULL == psHciContext )
1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL == psHciContext->p_jewel_info)
1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Jewel_Info_t      *ps_jewel_info=NULL;
1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info = (phHciNfc_Jewel_Info_t *)psHciContext->p_jewel_info ;
1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Update the pipe_id of the Jewel Gate obtained from the HCI
1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Response */
1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info->pipe_id = pipeID;
1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info->p_pipe_info = pPipeInfo;
1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Update the Response Receive routine of the Jewel Gate */
1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        pPipeInfo->recv_resp = phHciNfc_Recv_Jewel_Response;
1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Update the event Receive routine of the Jewel Gate */
1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        pPipeInfo->recv_event = phHciNfc_Recv_Jewel_Event;
1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Jewel_Update_Info(
2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             phHciNfc_sContext_t        *psHciContext,
2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             uint8_t                    infotype,
2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void                       *jewel_info
2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             )
2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if (NULL == psHciContext)
2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL == psHciContext->p_jewel_info)
2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Jewel_Info_t     *ps_jewel_info=NULL;
2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info = (phHciNfc_Jewel_Info_t *)
2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_jewel_info ;
2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch(infotype)
2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case HCI_JEWEL_ENABLE:
2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if (NULL != jewel_info)
2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_jewel_info->enable_jewel_gate =
2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        *((uint8_t *)jewel_info);
2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case HCI_JEWEL_INFO_SEQ:
2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_jewel_info->current_seq = JEWEL_READID_SEQUENCE;
2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_jewel_info->next_seq = JEWEL_READID_SEQUENCE;
2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            default:
2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Jewel_Info_Sequence (
2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               void             *psHciHandle,
2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               void             *pHwRef
2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               )
2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS               status = NFCSTATUS_SUCCESS;
2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t     *psHciContext =
2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            ((phHciNfc_sContext_t *)psHciHandle);
2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    static uint8_t          paraminfo[NXP_JEWEL_READID_LENGTH + 1] = {0};
2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext)
2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (NULL == pHwRef)
2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        )
2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if((NULL == psHciContext->p_jewel_info) ||
2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (HCI_JEWEL_ENABLE !=
2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))->
2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        enable_jewel_gate))
2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Jewel_Info_t      *ps_jewel_info=NULL;
2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Pipe_Info_t        *ps_pipe_info=NULL;
2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        uint8_t                     pipeid = 0;
2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info = (phHciNfc_Jewel_Info_t *)
2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_jewel_info ;
2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_pipe_info = ps_jewel_info->p_pipe_info;
2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL == ps_pipe_info )
2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI,
2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_INVALID_HCI_SEQUENCE);
2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            switch(ps_jewel_info->current_seq)
2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case JEWEL_READID_SEQUENCE:
2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pipeid = ps_pipe_info->pipe.pipe_id;
3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->reg_index = NXP_JEWEL_READID;
3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    paraminfo[0] = NXP_JEWEL_READID;
3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->param_info = (void *)&paraminfo;
3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->param_length = NXP_JEWEL_READID_LENGTH + 1;
3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Send_Jewel_Command(psHciContext,
3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            pHwRef, pipeid,
3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NXP_JEWEL_RAW);
3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NFCSTATUS_PENDING == status )
3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_jewel_info->next_seq = JEWEL_END_SEQUENCE;
3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case JEWEL_END_SEQUENCE:
3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phNfc_sCompletionInfo_t     CompInfo;
3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_pipe_info->reg_index = JEWEL_END_SEQUENCE;
3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if (JEWEL_MULTIPLE_TAGS_FOUND ==
3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ps_jewel_info->multiple_tgts_found)
3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        CompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        CompInfo.status = NFCSTATUS_SUCCESS;
3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    CompInfo.info = &(ps_jewel_info->s_jewel_info);
3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_jewel_info->s_jewel_info.RemDevType = phHal_eJewel_PICC;
3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_jewel_info->current_seq = JEWEL_READID_SEQUENCE;
3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_jewel_info->next_seq = JEWEL_READID_SEQUENCE;
3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = NFCSTATUS_SUCCESS;
3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Notify to the upper layer */
3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phHciNfc_Tag_Notify(psHciContext, pHwRef,
3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFC_NOTIFY_TARGET_DISCOVERED,
3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        &CompInfo);
3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                default:
3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = PHNFCSTVAL(CID_NFC_HCI,
3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_INVALID_HCI_RESPONSE);
3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Jewel_InfoUpdate(
3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            phHciNfc_sContext_t     *psHciContext,
3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 index,
3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 *reg_value,
3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t                 reg_length
3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            )
3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Jewel_Info_t       *ps_jewel_info = NULL;
3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHal_sJewelInfo_t          *ps_jewel_tag_info = NULL;
3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ps_jewel_info = (phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info);
3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ps_jewel_tag_info = &(ps_jewel_info->s_jewel_info.RemoteDevInfo.Jewel_Info);
3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    switch(index)
3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        case NXP_JEWEL_READID:
3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            HCI_PRINT_BUFFER("\tJewel ID", reg_value, reg_length);
3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NXP_JEWEL_READID_LENGTH == reg_length)
3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                uint8_t     i = 0;
3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_jewel_tag_info->HeaderRom0 = reg_value[i++];
3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_jewel_tag_info->HeaderRom1 = reg_value[i++];
3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void)memcpy(ps_jewel_tag_info->Uid,
3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            &(reg_value[i]),
3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            (reg_length - i));
3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_jewel_tag_info->UidLength = (reg_length - i);
3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = PHNFCSTVAL(CID_NFC_HCI,
3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_INVALID_HCI_RESPONSE);
3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            break;
3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        default:
3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI,
3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_INVALID_HCI_RESPONSE);
3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            break;
3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_Jewel_Packet(
4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            phHciNfc_sContext_t  *psHciContext,
4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t              *pResponse,
4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t            length
4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint16_t           length
4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            )
4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Jewel_Info_t       *ps_jewel_info = (phHciNfc_Jewel_Info_t *)
4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (psHciContext->p_jewel_info);
4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if (NXP_JEWEL_READID == ps_jewel_info->p_pipe_info->reg_index)
4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phHciNfc_Jewel_InfoUpdate(psHciContext,
4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            ps_jewel_info->p_pipe_info->reg_index,
4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            pResponse, (uint8_t)length);
4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Send Jewel data to the upper layer */
4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        HCI_PRINT_BUFFER("Jewel Bytes received", pResponse, length);
4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        psHciContext->rx_index = HCP_HEADER_LEN;
4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_Jewel_Response(
4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               void                *psContext,
4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               void                *pHwRef,
4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               uint8_t             *pResponse,
4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               uint8_t            length
4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               uint16_t           length
4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               )
4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t         *psHciContext =
4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (phHciNfc_sContext_t *)psContext;
4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (0 == length))
4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL == psHciContext->p_jewel_info)
4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Jewel_Info_t       *ps_jewel_info=NULL;
4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        uint8_t                     prev_cmd = ANY_GET_PARAMETER;
4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info = (phHciNfc_Jewel_Info_t *)
4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_jewel_info ;
4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( NULL == ps_jewel_info->p_pipe_info)
4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI,
4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_INVALID_HCI_SEQUENCE);
4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            prev_cmd = ps_jewel_info->p_pipe_info->prev_msg ;
4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            switch(prev_cmd)
4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_GET_PARAMETER:
4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if (length >= HCP_HEADER_LEN)
4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_Jewel_InfoUpdate(psHciContext,
4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            ps_jewel_info->p_pipe_info->reg_index,
4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            &pResponse[HCP_HEADER_LEN],
4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            (uint8_t)(length - HCP_HEADER_LEN));
4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = PHNFCSTVAL(CID_NFC_HCI,
4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_INVALID_HCI_RESPONSE);
4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_SET_PARAMETER:
4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("Jewel Parameter Set \n");
4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                UPDATE_SEQ);
5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_jewel_info->next_seq = JEWEL_READID_SEQUENCE;
5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_OPEN_PIPE:
5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("Jewel open pipe complete\n");
5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                UPDATE_SEQ);
5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ps_jewel_info->next_seq = JEWEL_READID_SEQUENCE;
5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_CLOSE_PIPE:
5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("Jewel close pipe complete\n");
5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
5155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                UPDATE_SEQ);
5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case NXP_JEWEL_RAW:
5195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("Jewel packet received \n");
5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if (length >= HCP_HEADER_LEN)
5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
5235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phHciNfc_Append_HCPFrame(psHciContext->recv_buffer,
5245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    0, pResponse, length);
5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->rx_total = length;
5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_Recv_Jewel_Packet(psHciContext,
5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    &pResponse[HCP_HEADER_LEN],
5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    (length - HCP_HEADER_LEN));
5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
5315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = PHNFCSTVAL(CID_NFC_HCI,
5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_INVALID_HCI_RESPONSE);
5345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case NXP_WRA_CONTINUE_ACTIVATION:
5385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case NXP_WR_ACTIVATE_ID:
5395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("Jewel continue activation or ");
5415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("reactivation completed \n");
5425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
5435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                UPDATE_SEQ);
5445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case NXP_WR_PRESCHECK:
5475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("Presence check completed \n");
5495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case NXP_WR_ACTIVATE_NEXT:
5525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_PRINT("Activate next completed \n");
5545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if (length > HCP_HEADER_LEN)
5555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
5565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if (JEWEL_MULTIPLE_TAGS_FOUND ==
5575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            pResponse[HCP_HEADER_LEN])
5585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            ps_jewel_info->multiple_tgts_found =
5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            JEWEL_MULTIPLE_TAGS_FOUND;
5615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
5625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
5635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            ps_jewel_info->multiple_tgts_found = FALSE;
5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
5675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
5685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
5695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = PHNFCSTVAL(CID_NFC_HCI,
5705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_INVALID_HCI_RESPONSE);
5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
5725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case NXP_WR_DISPATCH_TO_UICC:
5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    switch(length)
5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        case HCP_HEADER_LEN:
5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* Optional error code, if no error code field
5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                in the response, then this command is
5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                successfully completed */
5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            ps_jewel_info->uicc_activation =
5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        UICC_CARD_ACTIVATION_SUCCESS;
5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            break;
5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        case (HCP_HEADER_LEN + 1):
5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            ps_jewel_info->uicc_activation =
5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        pResponse[HCP_HEADER_LEN];
5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            break;
5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        } /* End of case (HCP_HEADER_LEN + index) */
5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        default:
5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            status = PHNFCSTVAL(CID_NFC_HCI,
5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NFCSTATUS_INVALID_HCI_RESPONSE);
5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            break;
5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if (NFCSTATUS_SUCCESS == status)
6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                    UPDATE_SEQ);
6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                default:
6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if( NFCSTATUS_SUCCESS == status )
6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_jewel_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;
6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_jewel_info->current_seq = ps_jewel_info->next_seq;
6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_Jewel_Event(
6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            void               *psContext,
6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            void               *pHwRef,
6285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t            *pEvent,
6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
6305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint8_t            length
6315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            uint16_t           length
6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            )
6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t         *psHciContext =
6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (phHciNfc_sContext_t *)psContext ;
6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (0 == length))
6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if((NULL == psHciContext->p_jewel_info) ||
6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (HCI_JEWEL_ENABLE !=
6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))->
6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        enable_jewel_gate))
6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_HCP_Packet_t       *p_packet = NULL;
6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Jewel_Info_t       *ps_jewel_info = NULL;
6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_HCP_Message_t      *message = NULL;
6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        uint8_t                     instruction=0,
6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    i = 0;
6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info = (phHciNfc_Jewel_Info_t *)
6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                psHciContext->p_jewel_info ;
6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        message = &p_packet->msg.message;
6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Get the instruction bits from the Message Header */
6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        instruction = (uint8_t) GET_BITS8( message->msg_header,
6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ((EVT_TARGET_DISCOVERED == instruction)
6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            && ((JEWEL_MULTIPLE_TAGS_FOUND == message->payload[i] )
6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            || (JEWEL_SINGLE_TAG_FOUND == message->payload[i]))
6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            )
6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            static phNfc_sCompletionInfo_t      pCompInfo;
6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (JEWEL_MULTIPLE_TAGS_FOUND == message->payload[i])
6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_jewel_info->multiple_tgts_found =
6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        JEWEL_MULTIPLE_TAGS_FOUND;
6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pCompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_jewel_info->multiple_tgts_found = FALSE;
6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pCompInfo.status = NFCSTATUS_SUCCESS;
6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            psHciContext->host_rf_type = phHal_eJewel_PCD;
6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_jewel_info->s_jewel_info.RemDevType = phHal_eJewel_PICC;
6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_jewel_info->current_seq = JEWEL_READID_SEQUENCE;
6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Notify to the HCI Generic layer To Update the FSM */
6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phHciNfc_Notify_Event(psHciContext, pHwRef,
6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFC_NOTIFY_TARGET_DISCOVERED,
6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                &pCompInfo);
6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Send_Jewel_Command(
7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              phHciNfc_sContext_t   *psContext,
7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              void                  *pHwRef,
7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              uint8_t               pipe_id,
7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              uint8_t               cmd
7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              )
7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t         *psHciContext =
7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (phHciNfc_sContext_t *)psContext ;
7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext) || (NULL == pHwRef) )
7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if((NULL == psHciContext->p_jewel_info) ||
7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (HCI_JEWEL_ENABLE !=
7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))->
7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        enable_jewel_gate) ||
7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (HCI_UNKNOWN_PIPE_ID ==
7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))->
7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        pipe_id) ||
7275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (pipe_id !=
7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))->
7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        pipe_id))
7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Jewel_Info_t       *ps_jewel_info=NULL;
7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Pipe_Info_t        *ps_pipe_info=NULL;
7375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
7385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_HCP_Message_t      *hcp_message = NULL;
7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        uint8_t                     i = 0,
7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    length = HCP_HEADER_LEN;
7415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info = (phHciNfc_Jewel_Info_t *)
7435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            psHciContext->p_jewel_info ;
7445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_pipe_info = ps_jewel_info->p_pipe_info;
7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL == ps_pipe_info )
7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI,
7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_INVALID_HCI_SEQUENCE);
7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            psHciContext->tx_total = 0 ;
7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
7545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (NXP_JEWEL_RAW == cmd)
7565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
7575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Construct the HCP Frame */
7585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
7595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
7605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                hcp_message = &(hcp_packet->msg.message);
7615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
7625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    i, (uint8_t *)ps_pipe_info->param_info,
7635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    ps_pipe_info->param_length);
7645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                length =(uint8_t)(length + i + ps_pipe_info->param_length);
7655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
7665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
7675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
7685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_COMMAND);
7695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
7705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (NFCSTATUS_SUCCESS == status)
7725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
7735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_COMMAND;
7745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_pipe_info->prev_msg = cmd;
7755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                psHciContext->tx_total = length;
7765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                psHciContext->response_pending = TRUE;
7775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Send the Constructed HCP packet to the lower layer */
7795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = phHciNfc_Send_HCP( psHciContext, pHwRef);
7805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ps_pipe_info->prev_status = status;
7815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
7825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
7855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
7865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
7885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Jewel_GetRID(
7895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phHciNfc_sContext_t   *psHciContext,
7905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                void                  *pHwRef)
7915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
7925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
7935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    static uint8_t              reader_id_info[NXP_JEWEL_READID_LENGTH] = {0};
7945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext) || (NULL == pHwRef))
7965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
7985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if((NULL == psHciContext->p_jewel_info) ||
8005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (HCI_JEWEL_ENABLE !=
8015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))->
8025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        enable_jewel_gate))
8035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
8055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
8075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Jewel_Info_t      *ps_jewel_info=NULL;
8095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Pipe_Info_t        *ps_pipe_info=NULL;
8105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        uint8_t                     pipeid = 0;
8115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_jewel_info = (phHciNfc_Jewel_Info_t *)
8135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_jewel_info ;
8145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ps_pipe_info = ps_jewel_info->p_pipe_info;
8165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL == ps_pipe_info )
8175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
8185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI,
8195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_INVALID_HCI_SEQUENCE);
8205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
8215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
8225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
8235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            pipeid = ps_jewel_info->pipe_id ;
8245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            reader_id_info[0] = NXP_JEWEL_READID;
8255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_pipe_info->param_info = (void *)&reader_id_info;
8275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ps_pipe_info->param_length = NXP_JEWEL_READID_LENGTH + 1 ;
8285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phHciNfc_Send_Jewel_Command(psHciContext,
8305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    pHwRef, pipeid,
8315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NXP_JEWEL_RAW);
8325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
8335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
8355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
8365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if defined(TYPE_JEWEL) */
8385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
840