nfc_ncif.c revision e29968cf3e053557a9c2efc5a7a42d0767c51d9d
145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/***************************************************************************** 245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Name: nfc_ncif.c 445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: This file contains functions that interface with the NFC NCI 645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** transport. On the receive side, it routes events to 745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** the appropriate handler (callback). On the 845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** transmit side, it manages the command transmission. 945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 1045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 1145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Copyright (c) 1999-2012, Broadcom Corp., All Rights Reserved. 1245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Broadcom Bluetooth Core. Proprietary and confidential. 1345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 1445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu******************************************************************************/ 1545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <string.h> 1645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfc_target.h" 1745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 1845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if NFC_INCLUDED == TRUE 1945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfc_api.h" 2045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nci_defs.h" 2145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nci_int.h" 2245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nci_hmsgs.h" 2345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfc_int.h" 2445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "rw_api.h" 2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "rw_int.h" 2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "hcidefs.h" 2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (NFC_RW_ONLY == FALSE) 2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic const UINT8 nfc_mpl_code_to_size[] = 3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{64, 128, 192, 254}; 3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif /* NFC_RW_ONLY */ 3345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define NFC_PB_ATTRIB_REQ_FIXED_BYTES 1 3645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define NFC_LB_ATTRIB_REQ_FIXED_BYTES 8 3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 4145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 4345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 44e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Function nfc_wait_2_deactivate_timeout 4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Handle a command timeout 4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_wait_2_deactivate_timeout (void) 5245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_ERROR0("nfc_wait_2_deactivate_timeout"); 5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_cb.flags &= ~NFC_FL_DEACTIVATING; 5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nci_snd_deactivate_cmd ((UINT8)((TIMER_PARAM_TYPE)nfc_cb.deactivate_timer.param)); 5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_send_data 6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description This function is called to add the NCI data header 6463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** and send it to NCI task for sending it to transport 6563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** as credits are available. 6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 7045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuUINT8 nfc_ncif_send_data (tNFC_CONN_CB *p_cb, BT_HDR *p_data) 7145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 7263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen UINT8 *pp; 7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 hdr0 = p_cb->conn_id; 7463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen UINT8 pbf = 0; 7563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen UINT8 ulen = (UINT8)(p_data->len); 7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 7763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_data->event = BT_EVT_TO_NFC_NCI; 7863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_data->layer_specific = p_cb->conn_id; 7963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_data->len += NCI_DATA_HDR_SIZE; 8063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_data->offset -= NCI_DATA_HDR_SIZE; 8163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen pp = (UINT8 *)(p_data + 1) + p_data->offset; 8263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* build NCI Data packet header */ 8363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen NCI_DATA_PBLD_HDR(pp, pbf, hdr0, ulen); 8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 8563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* post the p_buf to NCI task */ 8663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen GKI_send_msg (NCI_TASK, NCI_TASK_MBOX, p_data); 8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (NCI_STATUS_OK); 8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 9045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 9363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function nfc_ncif_send_vsc 9445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 9563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description Send NCI VS command to the NCI task 9645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 9745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 9845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 9945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 10063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid nfc_ncif_send_vsc (BT_HDR *p_buf) 10145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 10263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* post the p_buf to NCI task */ 10363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_buf->event = BT_EVT_TO_NFC_NCI; 10463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_buf->layer_specific = NCI_MSGS_LS_NCI_VSC; 10563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen GKI_send_msg (NCI_TASK, NCI_TASK_MBOX, p_buf); 10645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 10863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function nfc_ncif_send_cmd 11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description Send NCI command to the NCI task 11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 11745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 11863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid nfc_ncif_send_cmd (BT_HDR *p_buf) 11945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 12063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* post the p_buf to NCI task */ 12163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_buf->event = BT_EVT_TO_NFC_NCI; 12263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_buf->layer_specific = NCI_MSGS_LS_CONTROL; 12363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen GKI_send_msg (NCI_TASK, NCI_TASK_MBOX, p_buf); 12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_process_event 13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process the data/response/notification 13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** from NFCC 13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns TRUE if need to free buffer 13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 13745faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuBOOLEAN nfc_ncif_process_event (BT_HDR *p_msg) 13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 mt, pbf, gid, *p, *pp; 14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu BOOLEAN free = TRUE; 14163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen UINT8 oid; 14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p = (UINT8 *)(p_msg + 1) + p_msg->offset; 14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pp = p; 14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NCI_MSG_PRS_HDR0(pp, mt, pbf, gid); 14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (mt) 14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_MT_DATA: 15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_DEBUG0( "NFC received data"); 15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_ncif_proc_data(p_msg); 15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu free = FALSE; 15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_MT_RSP: 15763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen NFC_TRACE_DEBUG1( "NFC received rsp gid:%d", gid); 15863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen oid = ((*pp) & NCI_OID_MASK); 15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (gid) 16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_GID_CORE: /* 0000b NCI Core group */ 16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu free = nci_proc_core_rsp(p_msg); 16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_GID_RF_MANAGE: /* 0001b NCI Discovery group */ 16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nci_proc_rf_management_rsp(p_msg); 16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (NFC_NFCEE_INCLUDED == TRUE) 16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (NFC_RW_ONLY == FALSE) 16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_GID_EE_MANAGE: /* 0x02 0010b NFCEE Discovery group */ 17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nci_proc_ee_management_rsp(p_msg); 17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_GID_PROP: /* 1111b Proprietary */ 17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_vs_evt_hdlr) 17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_vs_evt_hdlr)(NFC_INT_NCI_VS_RSP_EVT, p_msg); 17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nci_proc_prop_rsp (p_msg); 17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_ERROR1( "NFC: Unknown gid:%d", gid); 18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 18463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 18563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 18745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_MT_NTF: 18963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen NFC_TRACE_DEBUG1( "NFC received ntf gid:%d", gid); 19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (gid) 19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_GID_CORE: /* 0000b NCI Core group */ 19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nci_proc_core_ntf(p_msg); 19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_GID_RF_MANAGE: /* 0001b NCI Discovery group */ 19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nci_proc_rf_management_ntf(p_msg); 19745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (NFC_NFCEE_INCLUDED == TRUE) 19945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (NFC_RW_ONLY == FALSE) 20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_GID_EE_MANAGE: /* 0x02 0010b NFCEE Discovery group */ 20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nci_proc_ee_management_ntf(p_msg); 20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_GID_PROP: /* 1111b Proprietary */ 20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_vs_evt_hdlr) 20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_vs_evt_hdlr)(NFC_INT_NCI_VS_NTF_EVT, p_msg); 20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nci_proc_prop_ntf (p_msg); 21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_ERROR1( "NFC: Unknown gid:%d", gid); 21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 21645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu default: 21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_DEBUG2( "NFC received unknown mt:0x%x, gid:%d", mt, gid); 21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (free); 22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_rf_management_status 22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to report an event 22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_rf_management_status(tNFC_DISCOVER_EVT event, UINT8 status) 23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_DISCOVER evt_data; 23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_discv_cback) 23745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.status = (tNFC_STATUS)status; 23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_discv_cback)(event, &evt_data); 24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_set_config_status 24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to report NFC_SET_CONFIG_REVT 24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_set_config_status (UINT8 *p, UINT8 len) 25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RESPONSE evt_data; 25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_resp_cback) 25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.set_config.status = (tNFC_STATUS)*p++; 25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.set_config.num_param_id = NFC_STATUS_OK; 25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (evt_data.set_config.status != NFC_STATUS_OK) 26045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 26145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.set_config.num_param_id = *p++; 26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(evt_data.set_config.param_ids, p, evt_data.set_config.num_param_id); 26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 26545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_resp_cback)(NFC_SET_CONFIG_REVT, &evt_data); 26645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_event_status 27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to report an event 27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_event_status(tNFC_RESPONSE_EVT event, UINT8 status) 27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RESPONSE evt_data; 28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_resp_cback) 28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.status = (tNFC_STATUS)status; 28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_resp_cback)(event, &evt_data); 28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_error_status 29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to report an error event to data cback 29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_error_status(UINT8 conn_id, UINT8 status) 29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN_CB * p_cb; 30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cb = nfc_find_conn_cb_by_conn_id(conn_id); 30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cb && p_cb->p_cback) 30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*p_cb->p_cback)(conn_id, NFC_ERROR_CEVT, (tNFC_CONN *) &status); 30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_rf_field_ntf 31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process RF field notification 31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (NFC_RW_ONLY == FALSE) 31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_rf_field_ntf(UINT8 rf_status) 31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RESPONSE evt_data; 32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_resp_cback) 32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.status = (tNFC_STATUS)NFC_STATUS_OK; 32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.rf_field.rf_field = rf_status; 32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_resp_cback)(NFC_RF_FIELD_REVT, &evt_data); 32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 33245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_decode_rf_params 33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process the detected technology 33545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** and mode and the associated parameters for DISCOVER_NTF and 33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** ACTIVATE_NTF 33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 34163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn CoenenUINT8 * nfc_ncif_decode_rf_params(tNFC_RF_TECH_PARAMS *p_param, UINT8 *p) 34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RF_PA_PARAMS *p_pa; 34445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 len, *p_start, u8; 34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RF_PB_PARAMS *p_pb; 34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RF_LF_PARAMS *p_lf; 34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RF_PF_PARAMS *p_pf; 34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RF_PISO15693_PARAMS *p_i93; 34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu len = *p++; 35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_start = p; 35245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (p_param->mode) 35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 35445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_DISCOVERY_TYPE_POLL_A: 35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_DISCOVERY_TYPE_POLL_A_ACTIVE: 35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pa = &p_param->param.pa; 35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* 35845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuSENS_RES Response 2 bytes Defined in [DIGPROT] Available after Technology Detection 35945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFCID1 length 1 byte Length of NFCID1 Available after Collision Resolution 36045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFCID1 4, 7, or 10 bytes Defined in [DIGPROT]Available after Collision Resolution 36145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuSEL_RES Response 1 byte Defined in [DIGPROT]Available after Collision Resolution 36245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 36345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(p_pa->sens_res, p, 2); 36445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pa->nfcid1_len = *p++; 36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pa->nfcid1_len > NCI_NFCID1_MAX_LEN) 36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pa->nfcid1_len = NCI_NFCID1_MAX_LEN; 36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(p_pa->nfcid1, p, p_pa->nfcid1_len); 36845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu u8 = *p++; 36945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (u8) 37045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pa->sel_rsp = *p++; 37145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 37245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_DISCOVERY_TYPE_POLL_B: 37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* 37545faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuSENSB_RES Response length (n) 1 byte Length of SENSB_RES Response (Byte 2 - Byte 12 or 13)Available after Technology Detection 37645faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuSENSB_RES Response Byte 2 - Byte 12 or 13 11 or 12 bytes Defined in [DIGPROT] Available after Technology Detection 37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pb = &p_param->param.pb; 37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pb->sensb_res_len = *p++; 38045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pb->sensb_res_len > NCI_MAX_SENSB_RES_LEN) 38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pb->sensb_res_len = NCI_MAX_SENSB_RES_LEN; 38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(p_pb->sensb_res, p, p_pb->sensb_res_len); 38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy(p_pb->nfcid0, p_pb->sensb_res, NFC_NFCID0_MAX_LEN); 38445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 38545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 38645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_DISCOVERY_TYPE_POLL_F: 38745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_DISCOVERY_TYPE_POLL_F_ACTIVE: 38845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* 38945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuBit Rate 1 byte 1 212 kbps/2 424 kbps/0 and 3 to 255 RFU 39045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuSENSF_RES Response length.(n) 1 byte Length of SENSF_RES (Byte 2 - Byte 17 or 19).Available after Technology Detection 39145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuSENSF_RES Response Byte 2 - Byte 17 or 19 n bytes Defined in [DIGPROT] Available after Technology Detection 39245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu */ 39345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pf = &p_param->param.pf; 39445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pf->bit_rate = *p++; 39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pf->sensf_res_len = *p++; 39645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_pf->sensf_res_len > NCI_MAX_SENSF_RES_LEN) 39745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pf->sensf_res_len = NCI_MAX_SENSF_RES_LEN; 39845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(p_pf->sensf_res, p, p_pf->sensf_res_len); 39945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memcpy(p_pf->nfcid2, p_pf->sensf_res, NCI_NFCID2_LEN); 40045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pf->mrti_check = p_pf->sensf_res[NCI_MRTI_CHECK_INDEX]; 40145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_pf->mrti_update = p_pf->sensf_res[NCI_MRTI_UPDATE_INDEX]; 40245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 40345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 40445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_DISCOVERY_TYPE_LISTEN_F: 40545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_DISCOVERY_TYPE_LISTEN_F_ACTIVE: 40645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_lf = &p_param->param.lf; 40745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu u8 = *p++; 40845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (u8) 40945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 41045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(p_lf->nfcid2, p, NCI_NFCID2_LEN); 41145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 41245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 41345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 41445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_DISCOVERY_TYPE_POLL_ISO15693: 41545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_i93 = &p_param->param.pi93; 41645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_i93->flag = *p++; 41745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_i93->dsfid = *p++; 41845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(p_i93->uid, p, NFC_ISO15693_UID_LEN); 41945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 42045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 42145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_DISCOVERY_TYPE_POLL_KOVIO: 42245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_param->param.pk.uid_len = *p++; 42345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(p_param->param.pk.uid, p, NFC_KOVIO_MAX_LEN); 42445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 42545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 42645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 42745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return (p_start + len); 42845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 42945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 43045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 43145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 43245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_discover_ntf 43345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 43445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process discover notification 43545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 43645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 43745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 43845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 43945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_discover_ntf (UINT8 *p, UINT16 plen) 44045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 44145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_DISCOVER evt_data; 44245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 44345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_discv_cback) 44445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 44545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p += NCI_MSG_HDR_SIZE; 44645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.status = NCI_STATUS_OK; 44745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.result.rf_disc_id = *p++; 44845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.result.protocol = *p++; 44945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 45045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* fill in tNFC_RESULT_DEVT */ 45163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.result.rf_tech_param.mode = *p++; 45263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p = nfc_ncif_decode_rf_params(&evt_data.result.rf_tech_param, p); 45345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 45445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.result.more = *p++; 45545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_discv_cback)(NFC_RESULT_DEVT, &evt_data); 45645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 45745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 45845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 45945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 46045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 46145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_activate 46245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 46345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process de-activate 46445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** response and notification 46545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 46645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 46745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 46845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 46945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_activate(UINT8 *p, UINT8 len) 47045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 47145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_DISCOVER evt_data; 47245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_INTF_PARAMS *p_intf = &evt_data.activate.intf_param; 47345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_INTF_PA_ISO_DEP *p_pa_iso; 47445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_INTF_LB_ISO_DEP *p_lb_iso; 47545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_INTF_PB_ISO_DEP *p_pb_iso; 47645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (NFC_RW_ONLY == FALSE) 47745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_INTF_PA_NFC_DEP *p_pa_nfc; 47845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu int mpl_idx = 0; 47945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 gb_idx = 0, mpl; 48045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 48145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 t0; 48245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNCI_DISCOVERY_TYPE mode; 48345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN_CB * p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; 48445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 *pp, len_act; 48563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen tNFC_ACTIVATE_MSGS *p_msgs; 48663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen UINT8 buff_size, num_buff; 48745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 48845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_set_state (NFC_STATE_OPEN); 48945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 49063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen memset (p_intf, 0, sizeof(tNFC_INTF_PARAMS)); 49163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.activate.rf_disc_id = *p++; 49263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_intf->type = *p++; 49363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.activate.protocol = *p++; 49463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 49563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (evt_data.activate.protocol == NCI_PROTOCOL_18092_ACTIVE) 49663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.activate.protocol = NCI_PROTOCOL_NFC_DEP; 49763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 49863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.activate.rf_tech_param.mode = *p++; 49963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen buff_size = *p++; 50063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen num_buff = *p++; 50163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* fill in tNFC_activate_DEVT */ 50263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p = nfc_ncif_decode_rf_params(&evt_data.activate.rf_tech_param, p); 50363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 50463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.activate.rf_tech_param.mode = *p++; 50563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.activate.tx_bitrate = *p++; 50663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.activate.rx_bitrate = *p++; 50763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen mode = evt_data.activate.rf_tech_param.mode; 50863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen len_act = *p++; 50963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen NFC_TRACE_DEBUG3( "nfc_ncif_proc_activate:%d %d, mode:0x%02x", len, len_act, mode); 51063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* just in case the interface reports activation parameters not defined in the NCI spec */ 51163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_intf->intf_param.frame.param_len = len_act; 51263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_intf->intf_param.frame.param_len > NFC_MAX_RAW_PARAMS) 51363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_intf->intf_param.frame.param_len = NFC_MAX_RAW_PARAMS; 51463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen pp = p; 51563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen STREAM_TO_ARRAY(p_intf->intf_param.frame.param, pp, p_intf->intf_param.frame.param_len); 51663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (evt_data.activate.intf_param.type == NCI_INTERFACE_ISO_DEP) 51763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 51863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* Make max payload of NCI aligned to max payload of ISO-DEP for better performance */ 51963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (buff_size > NCI_ISO_DEP_MAX_INFO) 52063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen buff_size = NCI_ISO_DEP_MAX_INFO; 52145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 52263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen switch (mode) 52363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 52463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen case NCI_DISCOVERY_TYPE_POLL_A: 52563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_iso = &p_intf->intf_param.pa_iso; 52663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_iso->ats_res_len = *p++; 52745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 52863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pa_iso->ats_res_len == 0) 52945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 53045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 53163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pa_iso->ats_res_len > NFC_MAX_ATS_LEN) 53263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_iso->ats_res_len = NFC_MAX_ATS_LEN; 53363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen STREAM_TO_ARRAY(p_pa_iso->ats_res, p, p_pa_iso->ats_res_len); 53463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen pp = &p_pa_iso->ats_res[NCI_ATS_T0_INDEX]; 53563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen t0 = p_pa_iso->ats_res[NCI_ATS_T0_INDEX]; 53663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen pp++; /* T0 */ 53763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (t0 & NCI_ATS_TA_MASK) 53863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen pp++; /* TA */ 53963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (t0 & NCI_ATS_TB_MASK) 54063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 54163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* FWI (Frame Waiting time Integer) & SPGI (Start-up Frame Guard time Integer) */ 54263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_iso->fwi = (((*pp) >> 4) & 0x0F); 54363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_iso->sfgi = ((*pp) & 0x0F); 54463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen pp++; /* TB */ 54563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 54663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (t0 & NCI_ATS_TC_MASK) 54763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 54863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_iso->nad_used = ((*pp) & 0x01); 54963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen pp++; /* TC */ 55063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 55163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_iso->his_byte_len = (UINT8)(p_pa_iso->ats_res_len - (pp - p_pa_iso->ats_res)); 55263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen memcpy (p_pa_iso->his_byte, pp, p_pa_iso->his_byte_len); 55363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen break; 55445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 55563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen case NCI_DISCOVERY_TYPE_LISTEN_A: 55663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_intf->intf_param.la_iso.rats = *p++; 55763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen break; 55845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 55963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen case NCI_DISCOVERY_TYPE_POLL_B: 56063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* ATTRIB RSP 56163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen Byte 1 Byte 2 ~ 2+n-1 56263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen MBLI/DID Higher layer - Response 56363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen */ 56463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pb_iso = &p_intf->intf_param.pb_iso; 56563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pb_iso->attrib_res_len = *p++; 56645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 56763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pb_iso->attrib_res_len == 0) 56845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 56945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 57063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pb_iso->attrib_res_len > NFC_MAX_ATTRIB_LEN) 57163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pb_iso->attrib_res_len = NFC_MAX_ATTRIB_LEN; 57263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen STREAM_TO_ARRAY(p_pb_iso->attrib_res, p, p_pb_iso->attrib_res_len); 57363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pb_iso->mbli = (p_pb_iso->attrib_res[0]) >> 4; 57463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pb_iso->attrib_res_len > NFC_PB_ATTRIB_REQ_FIXED_BYTES) 57563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 57663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pb_iso->hi_info_len = p_pb_iso->attrib_res_len - NFC_PB_ATTRIB_REQ_FIXED_BYTES; 57763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pb_iso->hi_info_len > NFC_MAX_GEN_BYTES_LEN) 57863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pb_iso->hi_info_len = NFC_MAX_GEN_BYTES_LEN; 57963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen memcpy (p_pb_iso->hi_info, &p_pb_iso->attrib_res[NFC_PB_ATTRIB_REQ_FIXED_BYTES], p_pb_iso->hi_info_len); 58063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 58163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen break; 58245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 58363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen case NCI_DISCOVERY_TYPE_LISTEN_B: 58463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* ATTRIB CMD 58563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen Byte 2~5 Byte 6 Byte 7 Byte 8 Byte 9 Byte 10 ~ 10+k-1 58663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen NFCID0 Param 1 Param 2 Param 3 Param 4 Higher layer - INF 58763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen */ 58863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_lb_iso = &p_intf->intf_param.lb_iso; 58963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_lb_iso->attrib_req_len = *p++; 59045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 59163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_lb_iso->attrib_req_len == 0) 59245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 59345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 59463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_lb_iso->attrib_req_len > NFC_MAX_ATTRIB_LEN) 59563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_lb_iso->attrib_req_len = NFC_MAX_ATTRIB_LEN; 59663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen STREAM_TO_ARRAY(p_lb_iso->attrib_req, p, p_lb_iso->attrib_req_len); 59763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen memcpy (p_lb_iso->nfcid0, p_lb_iso->attrib_req, NFC_NFCID0_MAX_LEN); 59863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_lb_iso->attrib_req_len > NFC_LB_ATTRIB_REQ_FIXED_BYTES) 59963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 60063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_lb_iso->hi_info_len = p_lb_iso->attrib_req_len - NFC_LB_ATTRIB_REQ_FIXED_BYTES; 60163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_lb_iso->hi_info_len > NFC_MAX_GEN_BYTES_LEN) 60263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_lb_iso->hi_info_len = NFC_MAX_GEN_BYTES_LEN; 60363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen memcpy (p_lb_iso->hi_info, &p_lb_iso->attrib_req[NFC_LB_ATTRIB_REQ_FIXED_BYTES], p_lb_iso->hi_info_len); 60463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 60563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen break; 60645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 60763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 60863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 60945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (NFC_RW_ONLY == FALSE) 61063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else if (evt_data.activate.intf_param.type == NCI_INTERFACE_NFC_DEP) 61163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 61263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* Make max payload of NCI aligned to max payload of NFC-DEP for better performance */ 61363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (buff_size > NCI_NFC_DEP_MAX_DATA) 61463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen buff_size = NCI_NFC_DEP_MAX_DATA; 61545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 61663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_nfc = &p_intf->intf_param.pa_nfc; 61763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_nfc->atr_res_len = *p++; 61845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 61963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pa_nfc->atr_res_len > 0) 62063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 62163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pa_nfc->atr_res_len > NFC_MAX_ATS_LEN) 62263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_nfc->atr_res_len = NFC_MAX_ATS_LEN; 62363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen STREAM_TO_ARRAY(p_pa_nfc->atr_res, p, p_pa_nfc->atr_res_len); 62463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if ((mode == NCI_DISCOVERY_TYPE_POLL_A) 62563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen ||(mode == NCI_DISCOVERY_TYPE_POLL_F) 62663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen ||(mode == NCI_DISCOVERY_TYPE_POLL_A_ACTIVE) 62763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen ||(mode == NCI_DISCOVERY_TYPE_POLL_F_ACTIVE)) 62845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 62963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* ATR_RES 63063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen Byte 3~12 Byte 13 Byte 14 Byte 15 Byte 16 Byte 17 Byte 18~18+n 63163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen NFCID3T DIDT BST BRT TO PPT [GT0 ... GTn] */ 63263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen mpl_idx = 14; 63363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen gb_idx = NCI_P_GEN_BYTE_INDEX; 63463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_nfc->waiting_time = p_pa_nfc->atr_res[NCI_L_NFC_DEP_TO_INDEX] & 0x0F; 63563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 63663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else if ((mode == NCI_DISCOVERY_TYPE_LISTEN_A) 63763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen ||(mode == NCI_DISCOVERY_TYPE_LISTEN_F) 63863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen ||(mode == NCI_DISCOVERY_TYPE_LISTEN_A_ACTIVE) 63963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen ||(mode == NCI_DISCOVERY_TYPE_LISTEN_F_ACTIVE)) 64063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 64163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* ATR_REQ 64263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen Byte 3~12 Byte 13 Byte 14 Byte 15 Byte 16 Byte 17~17+n 64363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen NFCID3I DIDI BSI BRI PPI [GI0 ... GIn] */ 64463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen mpl_idx = 13; 64563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen gb_idx = NCI_L_GEN_BYTE_INDEX; 64663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 64745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 64863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen mpl = ((p_pa_nfc->atr_res[mpl_idx]) >> 4) & 0x03; 64963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_nfc->max_payload_size = nfc_mpl_code_to_size[mpl]; 65063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pa_nfc->atr_res_len > gb_idx) 65163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 65263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_nfc->gen_bytes_len = p_pa_nfc->atr_res_len - gb_idx; 65363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_pa_nfc->gen_bytes_len > NFC_MAX_GEN_BYTES_LEN) 65463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_pa_nfc->gen_bytes_len = NFC_MAX_GEN_BYTES_LEN; 65563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen memcpy(p_pa_nfc->gen_bytes, &p_pa_nfc->atr_res[gb_idx], p_pa_nfc->gen_bytes_len); 65645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 65745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 65863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 65945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 66045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cb->act_protocol = evt_data.activate.protocol; 66163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 66263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* update RF connection buffer size and credit on NCI task before calling callback function */ 66363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_msgs = (tNFC_ACTIVATE_MSGS *) GKI_getbuf(sizeof (tNFC_ACTIVATE_MSGS)); 66463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_msgs) 66563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 66663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_msgs->buff_size = buff_size; 66763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_msgs->num_buff = num_buff; 66863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_msgs->bt_hdr.event = BT_EVT_TO_NFC_MSGS; 66963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_msgs->bt_hdr.layer_specific = NFC_MSGS_RF_ACT_CREDITS; 67063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen GKI_send_msg (NCI_TASK, NCI_TASK_MBOX, p_msgs); 67163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen } 67263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen 67363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (nfc_cb.p_discv_cback) 67463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 67545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_discv_cback)(NFC_ACTIVATE_DEVT, &evt_data); 67645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 67745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 67845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 67945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 68045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 68145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_deactivate 68245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 68345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process de-activate 68445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** response and notification 68545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 68645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 68745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 68845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 68945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_deactivate(UINT8 status, UINT8 deact_type, BOOLEAN is_ntf) 69045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 69145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_DISCOVER evt_data; 69245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_DEACTIVATE_DEVT *p_deact; 69345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN_CB * p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; 69445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu void *p_data; 69545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 69645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_set_state (NFC_STATE_IDLE); 69745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_deact = &evt_data.deactivate; 69845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_deact->status = status; 69945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_deact->type = deact_type; 70045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_deact->is_ntf = is_ntf; 70145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 70245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu while ( (p_data = GKI_dequeue(&p_cb->rx_q)) != NULL) 70345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 70445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_freebuf(p_data); 70545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 70645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 70745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cb->p_cback) 70845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*p_cb->p_cback)(NFC_RF_CONN_ID, NFC_DEACTIVATE_CEVT, (tNFC_CONN *) p_deact); 70945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 71045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_discv_cback) 71145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 71245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_discv_cback)(NFC_DEACTIVATE_DEVT, &evt_data); 71345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 71445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 71545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 71645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 71745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_ee_action 71845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 71945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process NFCEE ACTION NTF 72045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 72145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 72245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 72345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 72445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if ((NFC_NFCEE_INCLUDED == TRUE) && (NFC_RW_ONLY == FALSE)) 72545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_ee_action(UINT8 *p, UINT16 plen) 72645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 72745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_EE_ACTION_REVT evt_data; 72845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RESPONSE_CBACK *p_cback = nfc_cb.p_resp_cback; 72945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 data_len, ulen, tag, *p_data; 73045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 max_len; 73145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 73245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cback) 73345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 73445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu memset (&evt_data.act_data, 0, sizeof(tNFC_ACTION_DATA)); 73545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.status = NFC_STATUS_OK; 73645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.nfcee_id = *p++; 73745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.act_data.trigger = *p++; 73845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data_len = *p++; 73945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (plen >= 3) 74045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu plen -= 3; 74145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (data_len > plen) 74245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data_len = (UINT8)plen; 74345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 74445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch (evt_data.act_data.trigger) 74545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 74645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_EE_TRIG_7816_SELECT: 74745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (data_len > NFC_MAX_AID_LEN) 74845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data_len = NFC_MAX_AID_LEN; 74945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.act_data.param.aid.len_aid = data_len; 75045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(evt_data.act_data.param.aid.aid, p, data_len); 75145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 75245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_EE_TRIG_RF_PROTOCOL: 75345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.act_data.param.protocol = *p++; 75445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 75545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_EE_TRIG_RF_TECHNOLOGY: 75645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.act_data.param.technology = *p++; 75745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 75845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_EE_TRIG_APP_INIT: 75945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu while (data_len > NFC_TL_SIZE) 76045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 76145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data_len -= NFC_TL_SIZE; 76245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tag = *p++; 76345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu ulen = *p++; 76445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (ulen > data_len) 76545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu ulen = data_len; 76645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_data = NULL; 76745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu max_len = ulen; 76845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu switch(tag) 76945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 77045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_EE_ACT_TAG_AID: /* AID */ 77145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (max_len > NFC_MAX_AID_LEN) 77245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu max_len = NFC_MAX_AID_LEN; 77345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.act_data.param.app_init.len_aid = max_len; 77445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_data = evt_data.act_data.param.app_init.aid; 77545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 77645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu case NCI_EE_ACT_TAG_DATA: /* hex data for app */ 77745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (max_len > NFC_MAX_APP_DATA_LEN) 77845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu max_len = NFC_MAX_APP_DATA_LEN; 77945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.act_data.param.app_init.len_data = max_len; 78045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_data = evt_data.act_data.param.app_init.data; 78145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 78245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 78345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_data) 78445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 78545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(p_data, p, max_len); 78645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 78745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data_len -= ulen; 78845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 78945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu break; 79045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 79145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*p_cback) (NFC_EE_ACTION_REVT, (tNFC_RESPONSE *)&evt_data); 79245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 79345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 79445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 79545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 79645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 79745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_ee_discover_req 79845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 79945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process NFCEE DISCOVER REQ NTF 80045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 80145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 80245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 80345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 80445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_ee_discover_req(UINT8 *p, UINT16 plen) 80545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 80645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RESPONSE_CBACK *p_cback = nfc_cb.p_resp_cback; 80745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_EE_DISCOVER_REQ_REVT ee_disc_req; 80845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_EE_DISCOVER_INFO *p_info; 80945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 u8; 81045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 81145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_DEBUG2( "nfc_ncif_proc_ee_discover_req %d len:%d", *p, plen); 81245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cback) 81345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 81445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu u8 = *p; 81545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu ee_disc_req.status = NFC_STATUS_OK; 81645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu ee_disc_req.num_info = *p++; 81745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_info = ee_disc_req.info; 81845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (plen) 81945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu plen--; 82045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu while ((u8 > 0) && (plen >= NFC_EE_DISCOVER_ENTRY_LEN)) 82145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 82245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_info->op = *p++; /* T */ 82345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (*p != NFC_EE_DISCOVER_INFO_LEN)/* L */ 82445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 82545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_DEBUG1( "bad entry len:%d", *p ); 82645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 82745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 82845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p++; 82945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* V */ 83045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_info->nfcee_id = *p++; 83145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_info->tech_n_mode = *p++; 83245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_info->protocol = *p++; 83345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu u8--; 83445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu plen -=NFC_EE_DISCOVER_ENTRY_LEN; 83545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_info++; 83645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 83745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*p_cback) (NFC_EE_DISCOVER_REQ_REVT, (tNFC_RESPONSE *)&ee_disc_req); 83845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 83945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 84045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 84145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 84245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 84345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 84445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_get_routing 84545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 84645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process get routing notification 84745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 84845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 84945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 85045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 85145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_get_routing(UINT8 *p, UINT8 len) 85245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 85345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_GET_ROUTING_REVT evt_data; 85445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 more, num_entries, xx, yy, *pn, tl; 85545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_STATUS status = NFC_STATUS_CONTINUE; 85645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 85745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_resp_cback) 85845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 85945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu more = *p++; 86045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu num_entries = *p++; 86145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (xx=0; xx<num_entries; xx++) 86245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 86345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((more == FALSE) && (xx == (num_entries - 1))) 86445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = NFC_STATUS_OK; 86545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.status = (tNFC_STATUS)status; 86645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.nfcee_id = *p++; 86745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.num_tlvs = *p++; 86845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.tlv_size = 0; 86945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pn = evt_data.param_tlvs; 87045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu for (yy=0; yy<evt_data.num_tlvs; yy++) 87145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 87245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tl = *(p+1); 87345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tl += NFC_TL_SIZE; 87445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_ARRAY(pn, p, tl); 87545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.tlv_size += tl; 87645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pn += tl; 87745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 87845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_resp_cback)(NFC_GET_ROUTING_REVT, (tNFC_RESPONSE *)&evt_data); 87945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 88045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 88145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 88245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif 88345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 88445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 88545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 88645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_conn_create_rsp 88745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 888e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description This function is called to process connection create 889e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** response 89045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 89145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 89245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 89345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 89445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_conn_create_rsp (UINT8 *p, UINT16 plen, UINT8 dest_type) 89545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 89645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN_CB * p_cb; 89745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_STATUS status; 89845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN_CBACK *p_cback; 89945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN evt_data; 90045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 conn_id; 90145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 90245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* find the pending connection control block */ 90345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cb = nfc_find_conn_cb_by_conn_id(NFC_PEND_CONN_ID); 90445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cb) 90545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 90663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p += NCI_MSG_HDR_SIZE; 90763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen status = *p++; 90863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.conn_create.buff_size = *p++; 90963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen evt_data.conn_create.num_buffs = *p++; 91063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen conn_id = *p++; 91145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.conn_create.status = status; 91245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.conn_create.dest_type = dest_type; 91345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.conn_create.id = p_cb->id; 91445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cback = p_cb->p_cback; 91545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (status == NCI_STATUS_OK) 91645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 91745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_set_conn_id(p_cb, conn_id); 91845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 91945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 92045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 92145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_free_conn_cb (p_cb); 92245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 92345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 92445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 92545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cback) 92645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*p_cback)(conn_id, NFC_CONN_CREATE_CEVT, &evt_data); 92745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 92845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 92945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 93045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 93145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 93245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_report_conn_close_evt 93345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 93445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to report connection close event 93545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 93645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 93745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 93845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 93945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_report_conn_close_evt (UINT8 conn_id, tNFC_STATUS status) 94045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 94145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN evt_data; 94245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN_CBACK *p_cback; 94345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN_CB *p_cb; 94445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 94545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cb = nfc_find_conn_cb_by_conn_id(conn_id); 94645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cb) 94745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 94845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cback = p_cb->p_cback; 94945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_free_conn_cb(p_cb); 95045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.status = status; 95145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cback) 95245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*p_cback)(conn_id, NFC_CONN_CLOSE_CEVT, &evt_data); 95345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 95445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 95545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 95645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 95745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 95845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_reset_rsp 95945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 96045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process reset response/notification 96145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 96245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 96345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 96445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 96545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_reset_rsp (UINT8 *p, BOOLEAN is_ntf) 96645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 96745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 status = *p++; 96845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 96945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (is_ntf) 97045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 97145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_ERROR1( "reset notification!!:0x%x ", status); 97245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* clean up, if the state is OPEN 97345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu * FW does not report reset ntf right now */ 97445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.nfc_state == NFC_STATE_OPEN) 97545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 976e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu /*if any conn_cb is connected, close it. 97745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if any pending outgoing packets are dropped.*/ 97845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_reset_all_conn_cbs(); 97945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 98045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = NCI_STATUS_OK; 98145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 98245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 98345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.nfc_state == NFC_STATE_RESTARTING) 98445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 98545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_reset_all_conn_cbs(); 98645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 98745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 98845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (status == NCI_STATUS_OK) 98945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 99045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if ((*p) != NCI_VERSION) 99145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 99245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_ERROR2( "NCI version mismatch!!:0x%02x != 0x%02x ", NCI_VERSION, *p); 99363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if ((*p) < NCI_VERSION_0_F) 99445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 99545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_ERROR0( "NFCC version is too old"); 99645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_enabled(NCI_STATUS_FAILED, NULL); 99745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 99845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 99945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 100045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 100145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nci_snd_core_init (); 100245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 100345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu else 100445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 100545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_ERROR0 ("Failed to reset NFCC"); 100645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_enabled (status, NULL); 100745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 100845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 100945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 101045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 101145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 101245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_init_rsp 101345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 101445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process init response 101545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 101645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 101745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 101845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 101945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_init_rsp (BT_HDR *p_msg) 102045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 102145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 *p, status; 102245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN_CB * p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; 102345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 102445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p = (UINT8 *)(p_msg + 1) + p_msg->offset + NCI_MSG_HDR_SIZE; 102545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 102645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* handle init params in nfc_enabled */ 102745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu status = *p; 102845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (status == NCI_STATUS_OK) 102945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 103045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (nfc_cb.p_vs_evt_hdlr) 103145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*nfc_cb.p_vs_evt_hdlr)(NFC_INT_ENABLE_END_EVT, p_msg); 103245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cb->id = NFC_RF_CONN_ID; 103345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cb->act_protocol = NCI_PROTOCOL_UNKNOWN; 103445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 103545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 103645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_enabled(status, p_msg); 103745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_freebuf(p_msg); 103845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 103945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 104045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 104145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 104245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_get_config_rsp 104345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 104445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description This function is called to process get config response 104545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 104645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 104745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 104845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 104945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_get_config_rsp (BT_HDR *p_evt) 105045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 105145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 *p; 105245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RESPONSE_CBACK *p_cback = nfc_cb.p_resp_cback; 105345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_RESPONSE evt_data; 105445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 105545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_evt->offset += NCI_MSG_HDR_SIZE; 105645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_evt->len -= NCI_MSG_HDR_SIZE; 105745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cback) 105845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 105945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p = (UINT8 *)(p_evt + 1) + p_evt->offset; 106045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.get_config.status = *p++; 106145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.get_config.tlv_size = p_evt->len; 106245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu evt_data.get_config.p_param_tlvs = p; 106345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu (*p_cback)(NFC_GET_CONFIG_REVT, &evt_data); 106445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 106545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 106645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 106745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 106845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 106945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function nfc_ncif_proc_t3t_polling_ntf 107045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 107145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description Handle NCI_MSG_RF_T3T_POLLING NTF 107245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 107345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns void 107445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** 107545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 107645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_t3t_polling_ntf(UINT8 *p, UINT16 plen) 107745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 107845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 status; 107945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 num_responses; 108045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 108145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* Pass result to RW_T3T for processing */ 108245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8(status, p); 108345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu STREAM_TO_UINT8(num_responses, p); 108445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu plen-=NFC_TL_SIZE; 108545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu rw_t3t_handle_nci_poll_ntf(status, num_responses, (UINT8)plen, p); 108645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 108745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 108845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 108963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** 109063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function nfc_data_event 109163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** 109263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description Report Data event on the given connection control block 109363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** 109463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Returns void 109563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** 109645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 109745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_data_event(tNFC_CONN_CB * p_cb) 109845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 109963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen BT_HDR *p_evt; 110045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_DATA_CEVT data_cevt; 110145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 *p; 110245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 110363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_cb->p_cback) 110445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 110563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen while ( (p_evt = (BT_HDR *)GKI_dequeue(&p_cb->rx_q)) != NULL) 110645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 110763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* report data event */ 110863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_evt->offset += NCI_MSG_HDR_SIZE; 110963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_evt->len -= NCI_MSG_HDR_SIZE; 111063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_evt->layer_specific) 111163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen data_cevt.status = NFC_STATUS_BAD_LENGTH; 111263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen else 111345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu data_cevt.status = NFC_STATUS_OK; 111463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen data_cevt.p_data = p_evt; 111563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* adjust payload, if needed */ 111663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if (p_cb->conn_id == NFC_RF_CONN_ID) 111763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen { 111863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen /* if NCI_PROTOCOL_T1T/NCI_PROTOCOL_T2T/NCI_PROTOCOL_T3T, the status byte needs to be removed 111963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen */ 112063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen if ((p_cb->act_protocol >= NCI_PROTOCOL_T1T) && (p_cb->act_protocol <= NCI_PROTOCOL_T3T)) 112145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 112263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_evt->len--; 112363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p = (UINT8 *)(p_evt + 1); 112463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen data_cevt.status = *(p + p_evt->offset + p_evt->len); 112545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 112645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 112763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen (*p_cb->p_cback)(p_cb->conn_id, NFC_DATA_CEVT, (tNFC_CONN *)&data_cevt); 112863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen p_evt = NULL; 112945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 113045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 113145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 113245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 113345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/******************************************************************************* 113463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** 113563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function nfc_ncif_proc_data 113663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** 113763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description Find the connection control block associated with the data 113863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** packet and report the Data event. 113963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** 114063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Returns void 114163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** 114245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/ 114345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid nfc_ncif_proc_data(BT_HDR *p_msg) 114445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{ 114545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 *pp, cid, len; 114645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu tNFC_CONN_CB * p_cb; 114745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu UINT8 pbf; 114845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 114945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu pp = (UINT8 *)(p_msg+1) + p_msg->offset; 115045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NFC_TRACE_DEBUG3( "nfc_ncif_proc_data 0x%02x%02x%02x", pp[0], pp[1], pp[2]); 115145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu NCI_DATA_PRS_HDR(pp, pbf, cid, len); 115245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu p_cb = nfc_find_conn_cb_by_conn_id(cid); 115345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (p_cb && (p_msg->len >= NCI_DATA_HDR_SIZE)) 115445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 115563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen NFC_TRACE_DEBUG1 ( "nfc_ncif_proc_data len:%d", len); 115645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu if (len > 0) 115745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu { 115845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_enqueue (&p_cb->rx_q, p_msg); 115945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu nfc_data_event (p_cb); 116045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu return; 116145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 116245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu /* else an empty data packet*/ 116345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu } 116445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu GKI_freebuf (p_msg); 116545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu} 116645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu 116745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif /* NFC_INCLUDED == TRUE*/ 1168