1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu * Copyright (C) 2010-2014 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains function of the NFC unit to receive/process NCI 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * commands. 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 268a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 278a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <android-base/stringprintf.h> 288a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <base/logging.h> 298a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_target.h" 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 328a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include "bt_types.h" 338a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include "gki.h" 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_defs.h" 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_hmsgs.h" 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h" 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h" 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 398a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachusing android::base::StringPrintf; 408a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 418a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachextern bool nfc_debug_enabled; 428a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_proc_core_rsp 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI responses in the CORE group 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE-caller of this function to free the GKI buffer p_msg 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nci_proc_core_rsp(NFC_HDR* p_msg) { 536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *pp, len, op_code; 556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool free = true; 566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_old = nfc_cb.last_cmd; 576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* find the start of the NCI message and parse the NCI header */ 596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p + 1; 616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_MSG_PRS_HDR1(pp, op_code); 626767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 636767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nci_proc_core_rsp opcode:0x%x", op_code); 646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi len = *pp++; 656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* process the message based on the opcode and message type */ 676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (op_code) { 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_RESET: 696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_reset_rsp(pp, false); 706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_INIT: 736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_init_rsp(p_msg); 746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi free = false; 756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_GET_CONFIG: 786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_get_config_rsp(p_msg); 796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_SET_CONFIG: 826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_set_config_status(pp, len); 836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_CONN_CREATE: 866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_conn_create_rsp(p, p_msg->len, *p_old); 876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_CONN_CLOSE: 906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_report_conn_close_evt(*p_old, *pp); 916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 925e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna case NCI_MSG_CORE_SET_POWER_SUB_STATE: 935e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna nfc_ncif_event_status(NFC_SET_POWER_SUB_STATE_REVT, *pp); 945e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna break; 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 966767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code); 976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return free; 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_proc_core_ntf 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI notifications in the CORE group 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_core_ntf(NFC_HDR* p_msg) { 1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *pp, len, op_code; 1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t conn_id; 1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* find the start of the NCI message and parse the NCI header */ 1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p + 1; 1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_MSG_PRS_HDR1(pp, op_code); 1216767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 1226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nci_proc_core_ntf opcode:0x%x", op_code); 1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi len = *pp++; 1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* process the message based on the opcode and message type */ 1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (op_code) { 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_RESET: 1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_reset_rsp(pp, true); 1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_GEN_ERR_STATUS: 1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* process the error ntf */ 1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* in case of timeout: notify the static connection callback */ 1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_event_status(NFC_GEN_ERROR_REVT, *pp); 1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_error_status(NFC_RF_CONN_ID, *pp); 1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_INTF_ERR_STATUS: 1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_id = *(pp + 1); 1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_error_status(conn_id, *pp); 1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_CORE_CONN_CREDITS: 1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_credits(pp, len); 1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code); 1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_proc_rf_management_rsp 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI responses in the RF Management group 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_rf_management_rsp(NFC_HDR* p_msg) { 1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *pp, len, op_code; 1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_old = nfc_cb.last_cmd; 1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* find the start of the NCI message and parse the NCI header */ 1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p + 1; 1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_MSG_PRS_HDR1(pp, op_code); 1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi len = *pp++; 1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (op_code) { 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_DISCOVER: 1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_p2p_prio_logic(op_code, pp, NFA_DM_P2P_PRIO_RSP); 1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_rf_management_status(NFC_START_DEVT, *pp); 1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_DISCOVER_SELECT: 1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_rf_management_status(NFC_SELECT_DEVT, *pp); 1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_T3T_POLLING: 1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_DISCOVER_MAP: 1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_rf_management_status(NFC_MAP_DEVT, *pp); 1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_DEACTIVATE: 1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_dm_p2p_prio_logic(op_code, pp, NFA_DM_P2P_PRIO_RSP) == false) { 1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_deactivate(*pp, *p_old, false); 1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE) 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_SET_ROUTING: 2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_event_status(NFC_SET_ROUTING_REVT, *pp); 2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_GET_ROUTING: 2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (*pp != NFC_STATUS_OK) 2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_event_status(NFC_GET_ROUTING_REVT, *pp); 2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_PARAMETER_UPDATE: 2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_event_status(NFC_RF_COMM_PARAMS_UPDATE_REVT, *pp); 2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 215d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna case NCI_MSG_RF_ISO_DEP_NAK_PRESENCE: 216d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna nfc_ncif_proc_isodep_nak_presence_check_status(*pp, false); 217d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna break; 218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2196767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code); 2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_proc_rf_management_ntf 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI notifications in the RF Management group 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_rf_management_ntf(NFC_HDR* p_msg) { 2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *pp, len, op_code; 2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* find the start of the NCI message and parse the NCI header */ 2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p + 1; 2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_MSG_PRS_HDR1(pp, op_code); 2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi len = *pp++; 2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (op_code) { 2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case NCI_MSG_RF_DISCOVER: 2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_discover_ntf(p, p_msg->len); 2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_DEACTIVATE: 2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_dm_p2p_prio_logic(op_code, pp, NFA_DM_P2P_PRIO_NTF) == false) { 2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 25213c476001290c544cad3f1c4bc71f8d79ca8b47fLove Khanna if (NFC_GetNCIVersion() == NCI_VERSION_2_0) { 25313c476001290c544cad3f1c4bc71f8d79ca8b47fLove Khanna nfc_cb.deact_reason = *(pp + 1); 25413c476001290c544cad3f1c4bc71f8d79ca8b47fLove Khanna } 2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_deactivate(NFC_STATUS_OK, *pp, true); 2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_INTF_ACTIVATED: 2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_dm_p2p_prio_logic(op_code, pp, NFA_DM_P2P_PRIO_NTF) == false) { 2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_activate(pp, len); 2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_FIELD: 2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_rf_field_ntf(*pp); 2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_T3T_POLLING: 2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_t3t_polling_ntf(pp, len); 2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE) 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_GET_ROUTING: 2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_get_routing(pp, len); 2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_EE_ACTION: 2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_ee_action(pp, len); 2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_RF_EE_DISCOVERY_REQ: 2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_proc_ee_discover_req(pp, len); 2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 289d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna case NCI_MSG_RF_ISO_DEP_NAK_PRESENCE: 290d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna nfc_ncif_proc_isodep_nak_presence_check_status(*pp, true); 291d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna break; 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code); 2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE) 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_proc_ee_management_rsp 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI responses in the NFCEE Management group 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_ee_management_rsp(NFC_HDR* p_msg) { 3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *pp, len, op_code; 3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_RESPONSE_CBACK* p_cback = nfc_cb.p_resp_cback; 3141361d5216ba2017a629dc7438395ca47eede2175Myles Watson tNFC_RESPONSE nfc_response; 3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_RESPONSE_EVT event = NFC_NFCEE_INFO_REVT; 3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_old = nfc_cb.last_cmd; 3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* find the start of the NCI message and parse the NCI header */ 3196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 3206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p + 1; 3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_MSG_PRS_HDR1(pp, op_code); 3226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3236767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nci_proc_ee_management_rsp opcode:0x%x", op_code); 3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi len = *pp++; 3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (op_code) { 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_NFCEE_DISCOVER: 3281361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_discover.status = *pp++; 3291361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_discover.num_nfcee = *pp++; 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3311361d5216ba2017a629dc7438395ca47eede2175Myles Watson if (nfc_response.nfcee_discover.status != NFC_STATUS_OK) 3321361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_discover.num_nfcee = 0; 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi event = NFC_NFCEE_DISCOVER_REVT; 3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NCI_MSG_NFCEE_MODE_SET: 3381361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.mode_set.status = *pp; 3391361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.mode_set.nfcee_id = *p_old++; 3401361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.mode_set.mode = *p_old++; 34181e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna if (nfc_cb.nci_version != NCI_VERSION_2_0 || *pp != NCI_STATUS_OK) { 34281e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna nfc_cb.flags &= ~NFC_FL_WAIT_MODE_SET_NTF; 34381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna event = NFC_NFCEE_MODE_SET_REVT; 34481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna } else { 34581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna /* else response reports OK status on notification */ 34681e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna return; 34781e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna } 3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 35081e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna case NCI_MSG_NFCEE_POWER_LINK_CTRL: 3511361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.pl_control.status = *pp; 3521361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.pl_control.nfcee_id = *p_old++; 3531361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.pl_control.pl_control = *p_old++; 35481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna event = NFC_NFCEE_PL_CONTROL_REVT; 35581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna break; 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cback = NULL; 3586767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code); 3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3621361d5216ba2017a629dc7438395ca47eede2175Myles Watson if (p_cback) (*p_cback)(event, &nfc_response); 363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_proc_ee_management_ntf 368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI notifications in the NFCEE Management group 370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_ee_management_ntf(NFC_HDR* p_msg) { 3756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *pp, len, op_code; 3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_RESPONSE_CBACK* p_cback = nfc_cb.p_resp_cback; 3781361d5216ba2017a629dc7438395ca47eede2175Myles Watson tNFC_RESPONSE nfc_response; 3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_RESPONSE_EVT event = NFC_NFCEE_INFO_REVT; 38081e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna uint8_t* p_old = nfc_cb.last_cmd; 3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t xx; 3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t yy; 3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_NFCEE_TLV* p_tlv; 3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* find the start of the NCI message and parse the NCI header */ 3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p + 1; 3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_MSG_PRS_HDR1(pp, op_code); 3886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nci_proc_ee_management_ntf opcode:0x%x", op_code); 3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi len = *pp++; 3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (op_code == NCI_MSG_NFCEE_DISCOVER) { 3931361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_info.nfcee_id = *pp++; 3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3951361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_info.ee_status = *pp++; 3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi yy = *pp; 3971361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_info.num_interface = *pp++; 3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = pp; 3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4001361d5216ba2017a629dc7438395ca47eede2175Myles Watson if (nfc_response.nfcee_info.num_interface > NFC_MAX_EE_INTERFACE) 4011361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_info.num_interface = NFC_MAX_EE_INTERFACE; 4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4031361d5216ba2017a629dc7438395ca47eede2175Myles Watson for (xx = 0; xx < nfc_response.nfcee_info.num_interface; xx++) { 4041361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_info.ee_interface[xx] = *pp++; 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p + yy; 4081361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_info.num_tlvs = *pp++; 4096767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 4106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "nfcee_id: 0x%x num_interface:0x%x/0x%x, num_tlvs:0x%x", 4116767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi nfc_response.nfcee_info.nfcee_id, nfc_response.nfcee_info.num_interface, 4126767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi yy, nfc_response.nfcee_info.num_tlvs); 4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4141361d5216ba2017a629dc7438395ca47eede2175Myles Watson if (nfc_response.nfcee_info.num_tlvs > NFC_MAX_EE_TLVS) 4151361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_info.num_tlvs = NFC_MAX_EE_TLVS; 4166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4171361d5216ba2017a629dc7438395ca47eede2175Myles Watson p_tlv = &nfc_response.nfcee_info.ee_tlv[0]; 4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4191361d5216ba2017a629dc7438395ca47eede2175Myles Watson for (xx = 0; xx < nfc_response.nfcee_info.num_tlvs; xx++, p_tlv++) { 4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_tlv->tag = *pp++; 4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_tlv->len = yy = *pp++; 4226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 4236767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("tag:0x%x, len:0x%x", p_tlv->tag, p_tlv->len); 4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_tlv->len > NFC_MAX_EE_INFO) p_tlv->len = NFC_MAX_EE_INFO; 4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = pp; 4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_ARRAY(p_tlv->info, pp, p_tlv->len); 4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p += yy; 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 42981e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna } else if (op_code == NCI_MSG_NFCEE_MODE_SET) { 4301361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.mode_set.status = *pp; 4311361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.mode_set.nfcee_id = *p_old++; 4321361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.mode_set.mode = *p_old++; 43381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna event = NFC_NFCEE_MODE_SET_REVT; 43481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna nfc_cb.flags &= ~NFC_FL_WAIT_MODE_SET_NTF; 43581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna nfc_stop_timer(&nfc_cb.nci_mode_set_ntf_timer); 43681e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna } else if (op_code == NCI_MSG_NFCEE_STATUS) { 43781e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna event = NFC_NFCEE_STATUS_REVT; 4381361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_status.status = NCI_STATUS_OK; 4391361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_status.nfcee_id = *pp++; 4401361d5216ba2017a629dc7438395ca47eede2175Myles Watson nfc_response.nfcee_status.nfcee_status = *pp; 4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cback = NULL; 4436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("unknown opcode:0x%x", op_code); 4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4461361d5216ba2017a629dc7438395ca47eede2175Myles Watson if (p_cback) (*p_cback)(event, &nfc_response); 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_proc_prop_rsp 455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI responses in the Proprietary group 457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_prop_rsp(NFC_HDR* p_msg) { 4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_evt; 4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *pp, len, op_code; 4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_VS_CBACK* p_cback = (tNFC_VS_CBACK*)nfc_cb.p_vsc_cback; 4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* find the start of the NCI message and parse the NCI header */ 4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_evt = (uint8_t*)(p_msg + 1) + p_msg->offset; 4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p + 1; 4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_MSG_PRS_HDR1(pp, op_code); 4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi len = *pp++; 4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /*If there's a pending/stored command, restore the associated address of the 4746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * callback function */ 4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cback) 4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cback)((tNFC_VS_EVT)(NCI_RSP_BIT | op_code), p_msg->len, p_evt); 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 481d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Function nci_proc_prop_raw_vs_rsp 482d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** 483d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Description Process RAW VS responses 484d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** 485d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Returns void 486d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** 487d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna*******************************************************************************/ 488d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khannavoid nci_proc_prop_raw_vs_rsp(NFC_HDR* p_msg) { 489d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna uint8_t op_code; 490d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna tNFC_VS_CBACK* p_cback = (tNFC_VS_CBACK*)nfc_cb.p_vsc_cback; 491d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna 492d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna /* find the start of the NCI message and parse the NCI header */ 493d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna uint8_t* p_evt = (uint8_t*)(p_msg + 1) + p_msg->offset; 494d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna uint8_t* p = p_evt + 1; 495d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna NCI_MSG_PRS_HDR1(p, op_code); 496d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna 497d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna /* If there's a pending/stored command, restore the associated address of the 498d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna * callback function */ 499d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna if (p_cback) { 500d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna (*p_cback)((tNFC_VS_EVT)(NCI_RSP_BIT | op_code), p_msg->len, p_evt); 501d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna nfc_cb.p_vsc_cback = NULL; 502d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna } 503d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna nfc_cb.rawVsCbflag = false; 504d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna nfc_ncif_update_window(); 505d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna} 506d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna 507d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna/******************************************************************************* 508d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_proc_prop_ntf 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI notifications in the Proprietary group 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nci_proc_prop_ntf(NFC_HDR* p_msg) { 5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_evt; 5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *pp, len, op_code; 5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int i; 5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* find the start of the NCI message and parse the NCI header */ 5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_evt = (uint8_t*)(p_msg + 1) + p_msg->offset; 5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = p + 1; 5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_MSG_PRS_HDR1(pp, op_code); 5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi len = *pp++; 5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < NFC_NUM_VS_CBACKS; i++) { 5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.p_vs_cb[i]) { 5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*nfc_cb.p_vs_cb[i])((tNFC_VS_EVT)(NCI_NTF_BIT | op_code), p_msg->len, 5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_evt); 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 535