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_CE_A.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.14 $ * 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_A.h> 485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_A_EVT_NFC_SEND_DATA 0x10U 505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_A_EVT_NFC_FIELD_ON 0x11U 515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_A_EVT_NFC_DEACTIVATED 0x12U 525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_A_EVT_NFC_ACTIVATED 0x13U 535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define CE_A_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_A_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_A_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_A_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_A_Init_Resources( 1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext 1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_CE_A_Info_t *ps_ce_a_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_a_info ) && 1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHciNfc_Allocate_Resource((void **)(&ps_ce_a_info), 1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sizeof(phHciNfc_CE_A_Info_t))== NFCSTATUS_SUCCESS) 1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_ce_a_info = ps_ce_a_info; 1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->current_seq = HOST_CE_A_INVALID_SEQ; 1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_INVALID_SEQ; 1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_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_A_Initialise( 1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef 1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* 1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1. Open Pipe, 1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2. Set all parameters 1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static uint8_t sak = HOST_CE_A_SAK_DEFAULT; 1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static uint8_t atqa_info[] = { NXP_CE_A_ATQA_HIGH, 1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NXP_CE_A_ATQA_LOW}; 1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NULL == psHciContext) || (NULL == pHwRef)) 1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(NULL == psHciContext->p_ce_a_info) 1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_CE_A_Info_t *ps_ce_a_info = ((phHciNfc_CE_A_Info_t *) 1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_ce_a_info ); 1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *ps_pipe_info = NULL; 1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info = ps_ce_a_info->p_pipe_info; 1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == ps_pipe_info ) 1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_HCI_INFORMATION); 1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(ps_ce_a_info->current_seq) 1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case HOST_CE_A_PIPE_OPEN: 1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Open_Pipe( psHciContext, 1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, ps_pipe_info ); 1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_SUCCESS) 1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_SAK_SEQ; 1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_PENDING; 1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case HOST_CE_A_SAK_SEQ: 1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* HOST Card Emulation A SAK Configuration */ 1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info->reg_index = HOST_CE_A_SAK_INDEX; 1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Configure the SAK of Host Card Emulation A */ 1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sak = (uint8_t)HOST_CE_A_SAK_DEFAULT; 1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info->param_info =(void*)&sak ; 1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info->param_length = sizeof(sak) ; 1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef, 1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info->pipe.pipe_id, 1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)ANY_SET_PARAMETER); 1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_PENDING) 1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_ATQA_SEQ; 2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case HOST_CE_A_ATQA_SEQ: 2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* HOST Card Emulation A ATQA Configuration */ 2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info->reg_index = HOST_CE_A_ATQA_INDEX; 2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Configure the ATQA of Host Card Emulation A */ 2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info->param_info = (void*)atqa_info ; 2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info->param_length = sizeof(atqa_info) ; 2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef, 2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info->pipe.pipe_id, 2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)ANY_SET_PARAMETER); 2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_PENDING) 2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_ENABLE_SEQ; 2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case HOST_CE_A_ENABLE_SEQ: 2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_CE_A_Mode( psHciContext, 2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, HOST_CE_MODE_ENABLE ); 2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_PENDING) 2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_DISABLE_SEQ; 2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_SUCCESS; 2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default : 2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_A_Release( 2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef 2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* 2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1. Close pipe 2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NULL == psHciContext) || (NULL == pHwRef)) 2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(NULL == psHciContext->p_ce_a_info) 2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_CE_A_Info_t *ps_ce_a_info = ((phHciNfc_CE_A_Info_t *) 2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_ce_a_info ); 2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *ps_pipe_info = NULL; 2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_pipe_info = ps_ce_a_info->p_pipe_info; 2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == ps_pipe_info ) 2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NOT_ALLOWED); 2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(ps_ce_a_info->current_seq) 2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case HOST_CE_A_DISABLE_SEQ: 2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_CE_A_Mode( psHciContext, 2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, HOST_CE_MODE_DISABLE ); 2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_PENDING) 2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_PIPE_CLOSE; 2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case HOST_CE_A_PIPE_CLOSE: 2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* HOST Card Emulation A pipe close sequence */ 2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Close_Pipe( psHciContext, 2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, ps_pipe_info ); 2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_SUCCESS) 2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_PIPE_DELETE; 2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_PENDING; 2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case HOST_CE_A_PIPE_DELETE: 2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* HOST Card Emulation A pipe delete sequence */ 3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Delete_Pipe( psHciContext, 3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, ps_pipe_info ); 3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_SUCCESS) 3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if 0 3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->pipe_id = HCI_UNKNOWN_PIPE_ID; 3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_pipe_list[ps_ce_a_info->pipe_id] = NULL; 3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phOsalNfc_FreeMemory((void *)ps_ce_a_info->p_pipe_info); 3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->p_pipe_info = NULL; 3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_PIPE_OPEN; 3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default : 3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_A_Update_PipeInfo( 3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t pipeID, 3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *pPipeInfo 3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NULL == psHciContext ) 3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(NULL == psHciContext->p_ce_a_info) 3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL; 3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info = (phHciNfc_CE_A_Info_t *) 3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_ce_a_info ; 3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->current_seq = HOST_CE_A_PIPE_OPEN; 3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_PIPE_OPEN; 3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the pipe_id of the card emulation A Gate o 3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly btained from the HCI Response */ 3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->pipe_id = pipeID; 3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (HCI_UNKNOWN_PIPE_ID != pipeID) 3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->p_pipe_info = pPipeInfo; 3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NULL != pPipeInfo) 3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the Response Receive routine of the card 3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly emulation A Gate */ 3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pPipeInfo->recv_resp = &phHciNfc_Recv_CE_A_Response; 3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the event Receive routine of the card emulation A Gate */ 3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pPipeInfo->recv_event = &phHciNfc_Recv_CE_A_Event; 3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->p_pipe_info = NULL; 3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_A_Get_PipeID( 3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *ppipe_id 3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL != psHciContext) 3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly && ( NULL != ppipe_id ) 3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly && ( NULL != psHciContext->p_ce_a_info ) 3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL; 3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info = (phHciNfc_CE_A_Info_t *) 3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_ce_a_info ; 3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *ppipe_id = ps_ce_a_info->pipe_id ; 3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef CE_A_SEND_EVENT 4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_A_SendData_Event( 4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psContext, 4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pEvent, 4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext = 4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHciNfc_sContext_t *)psContext ; 4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef CE_A_SEND_EVENT */ 4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_CE_A_Response( 4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psContext, 4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pResponse, 4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN 4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t length 4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext = 4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHciNfc_sContext_t *)psContext ; 4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse) 4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (length == 0)) 4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(NULL == psHciContext->p_ce_a_info) 4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL; 4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t prev_cmd = ANY_GET_PARAMETER; 4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info = (phHciNfc_CE_A_Info_t *) 4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_ce_a_info ; 4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NULL == ps_ce_a_info->p_pipe_info) 4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_HCI_SEQUENCE); 4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly prev_cmd = ps_ce_a_info->p_pipe_info->prev_msg ; 4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(prev_cmd) 4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ANY_GET_PARAMETER: 4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if 0 4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_CE_A_InfoUpdate(psHciContext, 4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->p_pipe_info->reg_index, 4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &pResponse[HCP_HEADER_LEN], 4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (length - HCP_HEADER_LEN)); 4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if 0 */ 4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ANY_SET_PARAMETER: 4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_PRINT("CE A Parameter Set \n"); 4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ANY_OPEN_PIPE: 4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_PRINT("CE A open pipe complete\n"); 4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ANY_CLOSE_PIPE: 4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_PRINT("CE A close pipe complete\n"); 4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); 4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NFCSTATUS_SUCCESS == status ) 4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_CE_A_Update_Seq(psHciContext, 4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly UPDATE_SEQ); 4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS; 4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_A_Update_Seq( 5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_eSeqType_t seq_type 5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL; 5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NULL == psHciContext ) 5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if( NULL == psHciContext->p_ce_a_info ) 5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_FEATURE_NOT_SUPPORTED); 5155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info = (phHciNfc_CE_A_Info_t *) 5195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_ce_a_info ; 5205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(seq_type) 5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case RESET_SEQ: 5235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case INIT_SEQ: 5245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_PIPE_OPEN; 5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->current_seq = HOST_CE_A_PIPE_OPEN; 5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case UPDATE_SEQ: 5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->current_seq = ps_ce_a_info->next_seq; 5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case INFO_SEQ: 5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case REL_SEQ: 5395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->next_seq = HOST_CE_A_DISABLE_SEQ; 5415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->current_seq = HOST_CE_A_DISABLE_SEQ; 5425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 5455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 5515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 5525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 5555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_A_Mode( 5565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psHciHandle, 5575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 5585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t enable_type 5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 5615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 5625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static uint8_t param = 0 ; 5635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NULL == psHciContext)||(NULL == pHwRef)) 5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 5685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(NULL == psHciContext->p_ce_a_info) 5705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 5725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_CE_A_Info_t *ps_ce_a_info = (phHciNfc_CE_A_Info_t *) 5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_ce_a_info ; 5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *p_pipe_info = ps_ce_a_info->p_pipe_info; 5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NULL != p_pipe_info) 5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->reg_index = HOST_CE_A_MODE_INDEX; 5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Enable/Disable Host Card Emulation A */ 5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly param = (uint8_t)enable_type; 5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->param_info =(void*)¶m ; 5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->param_length = sizeof(param) ; 5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef, 5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info->pipe_id,(uint8_t)ANY_SET_PARAMETER); 5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_HCI_GATE_NOT_SUPPORTED); 5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_CE_A_Event( 6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psContext, 6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pEvent, 6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN 6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t length 6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext = 6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHciNfc_sContext_t *)psContext ; 6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent) 6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (length == 0)) 6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(NULL == psHciContext->p_ce_a_info) 6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Packet_t *p_packet = NULL; 6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_CE_A_Info_t *ps_ce_a_info=NULL; 6285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Message_t *message = NULL; 6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static phHal_sEventInfo_t event_info; 6305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t instruction=0; 6315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ps_ce_a_info = (phHciNfc_CE_A_Info_t *) 6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_ce_a_info ; 6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Variable was set but never used (ARM warning) */ 6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PHNFC_UNUSED_VARIABLE(ps_ce_a_info); 6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_packet = (phHciNfc_HCP_Packet_t *)pEvent; 6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly message = &p_packet->msg.message; 6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the instruction bits from the Message Header */ 6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly instruction = (uint8_t) GET_BITS8( message->msg_header, 6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCP_MSG_INSTRUCTION_OFFSET, 6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCP_MSG_INSTRUCTION_LEN); 6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->host_rf_type = phHal_eISO14443_A_PICC; 6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly event_info.eventHost = phHal_eHostController; 6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly event_info.eventSource = phHal_eISO14443_A_PICC; 6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(instruction) 6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case CE_A_EVT_NFC_ACTIVATED: 6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly event_info.eventType = NFC_EVT_ACTIVATED; 6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Notify to the HCI Generic layer To Update the FSM */ 6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case CE_A_EVT_NFC_DEACTIVATED: 6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly event_info.eventType = NFC_EVT_DEACTIVATED; 6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_PRINT("CE A Target Deactivated\n"); 6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case CE_A_EVT_NFC_SEND_DATA: 6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_PRINT("CE A data is received from the PN544\n"); 6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined (SEND_DATA_EVENT) 6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(length > HCP_HEADER_LEN) 6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_CE_A_ProcessData( 6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext, pHwRef, 6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &pEvent[HCP_HEADER_LEN], 6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (length - HCP_HEADER_LEN)); 6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_HCI_RESPONSE); 6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if defined (SEND_DATA_EVENT) */ 6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case CE_A_EVT_NFC_FIELD_ON: 6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_PRINT("CE A field on\n"); 6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly event_info.eventType = NFC_EVT_FIELD_ON; 6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case CE_A_EVT_NFC_FIELD_OFF: 6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_PRINT("CE A field off\n"); 6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly event_info.eventType = NFC_EVT_FIELD_OFF; 6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_HCI_INSTRUCTION); 6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_SUCCESS == status) 7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Notify_Event(psHciContext, pHwRef, 7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFC_NOTIFY_EVENT, 7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &event_info); 7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined (SEND_DATA_EVENT) 7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_CE_A_ProcessData( 7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pData, 7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static uint8_t send_data[] = {0x6D, 0x80}; 7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_CE_A_SendData_Event( 7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void *)psHciContext, pHwRef, 7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly send_data, sizeof(send_data)); 7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 7275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if defined (SEND_DATA_EVENT) */ 7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #if defined (HOST_EMULATION) */ 7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 733