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