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 functions that interface with the NFC NCI transport. 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * On the receive side, it routes events to the appropriate handler 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * (callback). On the transmit side, it manages the command transmission. 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 278a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 288a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <android-base/stringprintf.h> 290e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoi#include <android/hardware/nfc/1.1/types.h> 308a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <base/logging.h> 318a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h" 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 348a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include "bt_types.h" 356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "ce_int.h" 368a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include "gki.h" 376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nci_hmsgs.h" 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h" 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h" 405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE) 429343bf46e1ffabdd10973a3b71baa503567e319dRuchi Kandoi 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_int.h" 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* NFC mandates support for at least one logical connection; 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Update max_conn to the NFCC capability on InitRsp */ 476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define NFC_SET_MAX_CONN_DEFAULT() \ 486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { nfc_cb.max_conn = 1; } 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else /* NFC_RW_ONLY */ 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define ce_init() 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define llcp_init() 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_SET_MAX_CONN_DEFAULT() 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* NFC_RW_ONLY */ 578a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 588a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachusing android::base::StringPrintf; 590e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoiusing android::hardware::nfc::V1_1::NfcEvent; 608a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 618a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachextern bool nfc_debug_enabled; 620e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoiextern void delete_stack_non_volatile_store(bool forceDelete); 638a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/**************************************************************************** 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Declarations 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project****************************************************************************/ 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_CB nfc_cb; 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE) 706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define NFC_NUM_INTERFACE_MAP 2 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define NFC_NUM_INTERFACE_MAP 1 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic const tNCI_DISCOVER_MAPS nfc_interface_mapping[NFC_NUM_INTERFACE_MAP] = { 766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Protocols that use Frame Interface do not need to be included in the 776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi interface mapping */ 786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi {NCI_PROTOCOL_ISO_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN, 796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_INTERFACE_ISO_DEP} 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE) 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project , 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* this can not be set here due to 2079xB0 NFCC issues */ 836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi {NCI_PROTOCOL_NFC_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN, 846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_INTERFACE_NFC_DEP} 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_state_name 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function returns the state name. 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE conditionally compiled to save memory. 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns pointer to the name 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 997dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoistatic std::string nfc_state_name(uint8_t state) { 1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (state) { 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_STATE_NONE: 1027dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "NONE"; 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_STATE_W4_HAL_OPEN: 1047dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "W4_HAL_OPEN"; 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_STATE_CORE_INIT: 1067dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "CORE_INIT"; 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_STATE_W4_POST_INIT_CPLT: 1087dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "W4_POST_INIT_CPLT"; 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_STATE_IDLE: 1107dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "IDLE"; 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_STATE_OPEN: 1127dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "OPEN"; 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_STATE_CLOSING: 1147dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "CLOSING"; 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_STATE_W4_HAL_CLOSE: 1167dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "W4_HAL_CLOSE"; 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_STATE_NFCC_POWER_OFF_SLEEP: 1187dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "NFCC_POWER_OFF_SLEEP"; 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1207dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "???? UNKNOWN STATE"; 1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_event_name 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function returns the HAL event name. 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE conditionally compiled to save memory. 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns pointer to the name 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1357dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoistatic std::string nfc_hal_event_name(uint8_t event) { 1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (event) { 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_OPEN_CPLT_EVT: 1387dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "HAL_NFC_OPEN_CPLT_EVT"; 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_CLOSE_CPLT_EVT: 1407dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "HAL_NFC_CLOSE_CPLT_EVT"; 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_POST_INIT_CPLT_EVT: 1427dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "HAL_NFC_POST_INIT_CPLT_EVT"; 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_PRE_DISCOVER_CPLT_EVT: 1447dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "HAL_NFC_PRE_DISCOVER_CPLT_EVT"; 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_REQUEST_CONTROL_EVT: 1467dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "HAL_NFC_REQUEST_CONTROL_EVT"; 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_RELEASE_CONTROL_EVT: 1487dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "HAL_NFC_RELEASE_CONTROL_EVT"; 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_ERROR_EVT: 1507dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "HAL_NFC_ERROR_EVT"; 1510e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoi case (uint32_t)NfcEvent::HCI_NETWORK_RESET: 1520e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoi return "HCI_NETWORK_RESET"; 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1547dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi return "???? UNKNOWN EVENT"; 1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_main_notify_enable_status 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify status of Enable/PowerOffSleep/PowerCycle 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_main_notify_enable_status(tNFC_STATUS nfc_status) { 1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_RESPONSE evt_data; 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = nfc_status; 1695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.p_resp_cback) { 1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* if getting out of PowerOffSleep mode or restarting NFCC */ 1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.flags & (NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC)) { 1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~(NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC); 1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_status != NFC_STATUS_OK) { 1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP; 1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*nfc_cb.p_resp_cback)(NFC_NFCC_RESTART_REVT, &evt_data); 1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*nfc_cb.p_resp_cback)(NFC_ENABLE_REVT, &evt_data); 1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi} 1835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_enabled 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description NFCC enabled, proceed with stack start up. 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_enabled(tNFC_STATUS nfc_status, NFC_HDR* p_init_rsp_msg) { 1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_RESPONSE evt_data; 1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; 1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_interfaces = 0, xx; 198f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna uint8_t num_interface_extensions = 0, zz; 199f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna uint8_t interface_type; 2006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int yy = 0; 2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memset(&evt_data, 0, sizeof(tNFC_RESPONSE)); 2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_status == NCI_STATUS_OK) { 2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_IDLE); 2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_init_rsp_msg + 1) + p_init_rsp_msg->offset + 2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_MSG_HDR_SIZE + 1; 2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* we currently only support NCI of the same version. 2096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * We may need to change this, when we support multiple version of NFCC */ 210f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna 211f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna evt_data.enable.nci_version = nfc_cb.nci_version; 2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT32(evt_data.enable.nci_features, p); 213f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna if (nfc_cb.nci_version == NCI_VERSION_1_0) { 214f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna STREAM_TO_UINT8(num_interfaces, p); 215f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna evt_data.enable.nci_interfaces = 0; 216f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna for (xx = 0; xx < num_interfaces; xx++) { 217f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna if ((*p) <= NCI_INTERFACE_MAX) 218f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna evt_data.enable.nci_interfaces |= (1 << (*p)); 219f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna else if (((*p) >= NCI_INTERFACE_FIRST_VS) && 220f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) { 221f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna /* save the VS RF interface in control block, if there's still room */ 222f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna nfc_cb.vs_interface[yy++] = *p; 223f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna } 224f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna p++; 2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 226f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces; 227f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface, 228f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna NFC_NFCC_MAX_NUM_VS_INTERFACE); 2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.enable.max_conn = *p++; 2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT16(evt_data.enable.max_ce_table, p); 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE) 2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.max_ce_table = evt_data.enable.max_ce_table; 2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nci_features = evt_data.enable.nci_features; 2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.max_conn = evt_data.enable.max_conn; 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nci_ctrl_size = *p++; /* Max Control Packet Payload Length */ 2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->init_credits = p_cb->num_buff = 0; 2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_conn_id(p_cb, NFC_RF_CONN_ID); 240f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna if (nfc_cb.nci_version == NCI_VERSION_2_0) { 24181e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna if (evt_data.enable.nci_features & NCI_FEAT_HCI_NETWORK) { 24281e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID]; 24381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna nfc_set_conn_id(p_cb, NFC_HCI_CONN_ID); 24481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna p_cb->id = NFC_HCI_CONN_ID; 24581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna STREAM_TO_UINT8(p_cb->buff_size, p); 24681e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna STREAM_TO_UINT8(p_cb->num_buff, p); 24781e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna p_cb->init_credits = p_cb->num_buff; 24881e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna evt_data.enable.hci_packet_size = p_cb->buff_size; 24981e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna evt_data.enable.hci_conn_credits = p_cb->init_credits; 2506767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 2516767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "hci num_buf=%d buf_size=%d", p_cb->num_buff, p_cb->buff_size); 25281e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna } else { 25381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna /*HCI n/w not enabled skip data buff size and data credit HCI conn */ 25481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna p += 2; 25581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna } 256f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna STREAM_TO_UINT16(evt_data.enable.max_nfc_v_size, p); 257f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna STREAM_TO_UINT8(num_interfaces, p); 258f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna#if (NFC_RW_ONLY == FALSE) 259f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna nfc_cb.hci_packet_size = evt_data.enable.hci_packet_size; 260f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna nfc_cb.hci_conn_credits = evt_data.enable.hci_conn_credits; 261f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna nfc_cb.nci_max_v_size = evt_data.enable.max_nfc_v_size; 262f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna#endif 263f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna evt_data.enable.nci_interfaces = 0; 264f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna 265f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna for (xx = 0; xx < num_interfaces; xx++) { 266f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna if ((*p) <= NCI_INTERFACE_MAX) 267f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna evt_data.enable.nci_interfaces |= (1 << (*p)); 268f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna else if (((*p) >= NCI_INTERFACE_FIRST_VS) && 269f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) { 270f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna /* save the VS RF interface in control block, if there's still room */ 271f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna nfc_cb.vs_interface[yy++] = *p; 272f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna } 273f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna interface_type = *p++; 274f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna num_interface_extensions = *p++; 275f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna for (zz = 0; zz < num_interface_extensions; zz++) { 276a68fa7b601a0a5ff3b02834dca86b931ae1fa025Ruchi Kandoi if (((*p) < NCI_INTERFACE_EXTENSION_MAX) && 277f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna (interface_type <= NCI_INTERFACE_MAX)) { 278f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna nfc_cb.nci_intf_extensions |= (1 << (*p)); 279f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna nfc_cb.nci_intf_extension_map[*p] = (1 << interface_type); 280f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna } 281f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna p++; 282f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna } 283f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna } 284f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna 285f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces; 286f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface, 287f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna NFC_NFCC_MAX_NUM_VS_INTERFACE); 288f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna } else { 289f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna STREAM_TO_UINT16(evt_data.enable.max_param_size, p); 290f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna evt_data.enable.manufacture_id = *p++; 291f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna STREAM_TO_ARRAY(evt_data.enable.nfcc_info, p, NFC_NFCC_INFO_LEN); 292f928d73c8c23ab10ee3ad794094da3e52c730967Love Khanna } 2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_DiscoveryMap(nfc_cb.num_disc_maps, 2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (tNCI_DISCOVER_MAPS*)nfc_cb.p_disc_maps, NULL); 2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* else not successful. the buffers will be freed in nfc_free_conn_cb () */ 2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.flags & NFC_FL_RESTARTING) { 2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP); 3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_free_conn_cb(p_cb); 3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* if NFCC didn't respond to CORE_RESET or CORE_INIT */ 3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.nfc_state == NFC_STATE_CORE_INIT) { 3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* report status after closing HAL */ 3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_hal->close(); 3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else 3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_NONE); 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_main_notify_enable_status(nfc_status); 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_set_state 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set the state of NFC stack 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_set_state(tNFC_STATE nfc_state) { 3266767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3276767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nfc_set_state %d (%s)->%d (%s)", nfc_cb.nfc_state, 3286767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi nfc_state_name(nfc_cb.nfc_state).c_str(), nfc_state, 3296767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi nfc_state_name(nfc_state).c_str()); 3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nfc_state = nfc_state; 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_gen_cleanup 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 337552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description Clean up for both going into low power mode and disabling 338552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** NFC 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_gen_cleanup(void) { 3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~NFC_FL_DEACTIVATING; 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* the HAL pre-discover is still active - clear the pending flag/free the 3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * buffer */ 3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) { 3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING; 3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(nfc_cb.p_disc_pending); 3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_disc_pending = NULL; 3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~(NFC_FL_CONTROL_REQUESTED | NFC_FL_CONTROL_GRANTED | 3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_FL_HAL_REQUESTED); 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_timer(&nfc_cb.deactivate_timer); 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Reset the connection control blocks */ 3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_reset_all_conn_cbs(); 359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.p_nci_init_rsp) { 3616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(nfc_cb.p_nci_init_rsp); 3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_nci_init_rsp = NULL; 3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* clear any pending CMD/RSP */ 3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_main_flush_cmd_queue(); 367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_main_handle_hal_evt 372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle BT_EVT_TO_NFC_MSGS 374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_main_handle_hal_evt(tNFC_HAL_EVT_MSG* p_msg) { 3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* ps; 378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3796767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 3806767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("HAL event=0x%x", p_msg->hal_evt); 381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (p_msg->hal_evt) { 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_OPEN_CPLT_EVT: /* only for failure case */ 3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_enabled(NFC_STATUS_FAILED, NULL); 3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_CLOSE_CPLT_EVT: 3886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.p_resp_cback) { 3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) { 3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.flags & NFC_FL_POWER_OFF_SLEEP) { 3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~NFC_FL_POWER_OFF_SLEEP; 3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP); 3936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*nfc_cb.p_resp_cback)(NFC_NFCC_POWER_OFF_REVT, NULL); 3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_NONE); 3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, NULL); 3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_resp_cback = NULL; 3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* found error during initialization */ 4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_NONE); 4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_main_notify_enable_status(NFC_STATUS_FAILED); 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_POST_INIT_CPLT_EVT: 4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.p_nci_init_rsp) { 4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* 4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** if NFC_Disable() is called before receiving 4116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** HAL_NFC_POST_INIT_CPLT_EVT, then wait for HAL_NFC_CLOSE_CPLT_EVT. 4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.nfc_state == NFC_STATE_W4_POST_INIT_CPLT) { 4146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_msg->status == HAL_NFC_STATUS_OK) { 4156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_enabled(NCI_STATUS_OK, nfc_cb.p_nci_init_rsp); 4166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else /* if post initailization failed */ 4176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_enabled(NCI_STATUS_FAILED, NULL); 4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(nfc_cb.p_nci_init_rsp); 4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_nci_init_rsp = NULL; 4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_PRE_DISCOVER_CPLT_EVT: 4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* restore the command window, no matter if the discover command is still 4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * pending */ 4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW; 4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED; 4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) { 4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* issue the discovery command now, if it is still pending */ 4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING; 4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ps = (uint8_t*)nfc_cb.p_disc_pending; 4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nci_snd_discover_cmd(*ps, (tNFC_DISCOVER_PARAMS*)(ps + 1)); 4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(nfc_cb.p_disc_pending); 4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_disc_pending = NULL; 4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* check if there's other pending commands */ 4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_check_cmd_queue(NULL); 4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT) 4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT); 4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_REQUEST_CONTROL_EVT: 4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED; 4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags |= NFC_FL_HAL_REQUESTED; 4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_check_cmd_queue(NULL); 4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_RELEASE_CONTROL_EVT: 4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.flags & NFC_FL_CONTROL_GRANTED) { 4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED; 4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW; 4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_check_cmd_queue(NULL); 4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT) 4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT); 4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_ERROR_EVT: 4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (p_msg->status) { 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_STATUS_ERR_TRANSPORT: 4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of transport error */ 4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.p_resp_cback) { 4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*nfc_cb.p_resp_cback)(NFC_NFCC_TRANSPORT_ERR_REVT, NULL); 4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* if enabling NFC, notify upper layer of failure after closing HAL 4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 4746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.nfc_state < NFC_STATE_IDLE) { 4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_enabled(NFC_STATUS_FAILED, NULL); 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_STATUS_ERR_CMD_TIMEOUT: 4816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT); 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* if enabling NFC, notify upper layer of failure after closing HAL */ 4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.nfc_state < NFC_STATE_IDLE) { 4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_enabled(NFC_STATUS_FAILED, NULL); 4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4900e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoi case (uint32_t)NfcEvent::HCI_NETWORK_RESET: 4910e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoi delete_stack_non_volatile_store(true); 4920e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoi break; 4930e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoi 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 5006767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("unhandled event (0x%x).", p_msg->hal_evt); 5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_main_flush_cmd_queue 508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called when setting power off sleep state. 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_main_flush_cmd_queue(void) { 5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_msg; 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5176767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << __func__; 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* initialize command window */ 5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW; 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop command-pending timer */ 5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_timer(&nfc_cb.nci_wait_rsp_timer); 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* dequeue and free buffer */ 5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi while ((p_msg = (NFC_HDR*)GKI_dequeue(&nfc_cb.nci_cmd_xmit_q)) != NULL) { 5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg); 5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_main_post_hal_evt 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function posts HAL event to NFC_TASK 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_main_post_hal_evt(uint8_t hal_evt, tHAL_NFC_STATUS status) { 5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_HAL_EVT_MSG* p_msg; 5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5430c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_msg = (tNFC_HAL_EVT_MSG*)GKI_getbuf(sizeof(tNFC_HAL_EVT_MSG)); 5440c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_msg != NULL) { 5456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Initialize NFC_HDR */ 5466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.len = 0; 5476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.event = BT_EVT_TO_NFC_MSGS; 5486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.offset = 0; 5496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hdr.layer_specific = 0; 5506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->hal_evt = hal_evt; 5516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->status = status; 5526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg); 5536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 5546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("No buffer"); 5556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_main_hal_cback 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description HAL event handler 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_main_hal_cback(uint8_t event, tHAL_NFC_STATUS status) { 5686767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 5696767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nfc_main_hal_cback event: %s(0x%x), status=%d", 5706767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi nfc_hal_event_name(event).c_str(), event, status); 571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (event) { 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_OPEN_CPLT_EVT: 5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* 5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** if NFC_Disable() is called before receiving HAL_NFC_OPEN_CPLT_EVT, 5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** then wait for HAL_NFC_CLOSE_CPLT_EVT. 5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_OPEN) { 5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (status == HAL_NFC_STATUS_OK) { 5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify NFC_TASK that NCI tranport is initialized */ 5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_send_event(NFC_TASK, NFC_TASK_EVT_TRANSPORT_READY); 5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_main_post_hal_evt(event, status); 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_CLOSE_CPLT_EVT: 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_POST_INIT_CPLT_EVT: 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_PRE_DISCOVER_CPLT_EVT: 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_REQUEST_CONTROL_EVT: 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_RELEASE_CONTROL_EVT: 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HAL_NFC_ERROR_EVT: 5940e0bbcf363492f3c14122446bd871b64954ffefdRuchi Kandoi case (uint32_t)NfcEvent::HCI_NETWORK_RESET: 5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_main_post_hal_evt(event, status); 5966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 5996767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 6006767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nfc_main_hal_cback unhandled event %x", event); 6016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_main_hal_data_cback 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description HAL data event handler 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_main_hal_data_cback(uint16_t data_len, uint8_t* p_data) { 6156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_msg; 6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* ignore all data while shutting down NFCC */ 6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) { 6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_data) { 6230c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_NCI_POOL_ID); 6240c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_msg != NULL) { 6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Initialize NFC_HDR */ 6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->len = data_len; 6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->event = BT_EVT_TO_NFC_NCI; 6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->offset = NFC_RECEIVE_MSGS_OFFSET; 6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* no need to check length, it always less than pool size */ 6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy((uint8_t*)(p_msg + 1) + p_msg->offset, p_data, p_msg->len); 6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg); 6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 6356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("No buffer"); 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_Enable 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function enables NFC. Prior to calling NFC_Enable: 645552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** - the NFCC must be powered up, and ready to receive 646552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** commands. 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - GKI must be enabled 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - NFC_TASK must be started 649552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** - NCIT_TASK must be started (if using dedicated NCI 650552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** transport) 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** This function opens the NCI transport (if applicable), 653552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** resets the NFC controller, and initializes the NFC 654552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** subsystems. 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When the NFC startup procedure is completed, an 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_ENABLE_REVT is returned to the application using the 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tNFC_RESPONSE_CBACK. 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_Enable(tNFC_RESPONSE_CBACK* p_cback) { 6646767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << __func__; 6656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate callback */ 6676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (!p_cback) { 6686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_INVALID_PARAM); 6696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_resp_cback = p_cback; 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Open HAL transport. */ 6736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_W4_HAL_OPEN); 6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback); 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_OK); 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_Disable 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function performs clean up routines for shutting down 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC and closes the NCI transport (if using dedicated NCI 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** transport). 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When the NFC shutdown procedure is completed, an 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_DISABLED_REVT is returned to the application using the 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tNFC_RESPONSE_CBACK. 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns nothing 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid NFC_Disable(void) { 6956767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 6966767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nfc_state = %d", nfc_cb.nfc_state); 6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfc_cb.nfc_state == NFC_STATE_NONE) || 6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) { 7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_NONE); 7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.p_resp_cback) { 7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, NULL); 7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_resp_cback = NULL; 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Close transport and clean up */ 7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_task_shutdown_nfcc(); 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_Init 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function initializes control block for NFC 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns nothing 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid NFC_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl) { 7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int xx; 7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Clear nfc control block */ 7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memset(&nfc_cb, 0, sizeof(tNFC_CB)); 7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Reset the nfc control block */ 7286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++) { 7296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.conn_cb[xx].conn_id = NFC_ILLEGAL_CONN_ID; 7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* NCI init */ 7336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_hal = p_hal_entry_tbl; 7346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nfc_state = NFC_STATE_NONE; 7356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW; 7366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nci_wait_rsp_tout = NFC_CMD_CMPL_TIMEOUT; 7376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_disc_maps = nfc_interface_mapping; 7386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.num_disc_maps = NFC_NUM_INTERFACE_MAP; 7396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.nci_ctrl_size = NCI_CTRL_INIT_SIZE; 7406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.reassembly = true; 7413f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi nfc_cb.nci_version = NCI_VERSION_UNKNOWN; 7426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_init(); 7436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ce_init(); 7446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi llcp_init(); 7456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_SET_MAX_CONN_DEFAULT(); 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_GetLmrtSize 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called by application wto query the Listen Mode Routing 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Table size supported by NFCC 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Listen Mode Routing Table size 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 7586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint16_t NFC_GetLmrtSize(void) { 7596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t size = 0; 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_RW_ONLY == FALSE) 7616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi size = nfc_cb.max_ce_table; 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 7636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return size; 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_SetConfig 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to send the configuration parameter 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** TLV to NFCC. The response from NFCC is reported by 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tNFC_RESPONSE_CBACK as NFC_SET_CONFIG_REVT. 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters tlv_size - the length of p_param_tlvs. 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_param_tlvs - the parameter ID/Len/Value list 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_SetConfig(uint8_t tlv_size, uint8_t* p_param_tlvs) { 7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return nci_snd_core_set_config(p_param_tlvs, tlv_size); 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_GetConfig 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 788552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description This function is called to retrieve the parameter TLV from 789552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** NFCC. The response from NFCC is reported by 790552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** tNFC_RESPONSE_CBACK as NFC_GET_CONFIG_REVT. 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters num_ids - the number of parameter IDs 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_param_ids - the parameter ID list. 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_GetConfig(uint8_t num_ids, uint8_t* p_param_ids) { 7996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return nci_snd_core_get_config(p_param_ids, num_ids); 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_DiscoveryMap 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 806552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description This function is called to set the discovery interface 807552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** mapping. The response from NFCC is reported by 808552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** tNFC_DISCOVER_CBACK as NFC_MAP_DEVT. 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters num - the number of items in p_params. 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_maps - the discovery interface mappings 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_cback - the discovery callback function 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_DiscoveryMap(uint8_t num, tNFC_DISCOVER_MAPS* p_maps, 8186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_DISCOVER_CBACK* p_cback) { 8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_disc_maps = num; 8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t xx, yy, num_intf, intf_mask; 8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_DISCOVER_MAPS 8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi max_maps[NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX]; 8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool is_supported; 8246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_discv_cback = p_cback; 8266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi num_intf = 0; 8276767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 8286767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "nci_interfaces supported by NFCC: 0x%x", nfc_cb.nci_interfaces); 8296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX; xx++) { 8316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memset(&max_maps[xx], 0x00, sizeof(tNFC_DISCOVER_MAPS)); 8326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < num_disc_maps; xx++) { 8356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi is_supported = false; 8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_maps[xx].intf_type > NCI_INTERFACE_MAX) { 8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (yy = 0; yy < NFC_NFCC_MAX_NUM_VS_INTERFACE; yy++) { 8386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.vs_interface[yy] == p_maps[xx].intf_type) 8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi is_supported = true; 8406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8416767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 8426767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("[%d]: vs intf_type:0x%x is_supported:%d", xx, 8436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi p_maps[xx].intf_type, is_supported); 8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi intf_mask = (1 << (p_maps[xx].intf_type)); 8466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (intf_mask & nfc_cb.nci_interfaces) { 8476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi is_supported = true; 8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8496767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 8506767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("[%d]: intf_type:%d intf_mask: 0x%x is_supported:%d", 8516767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi xx, p_maps[xx].intf_type, intf_mask, is_supported); 8525cbce03e4a73a6950873b1a2b55cd09997b67a96Jizhou Liao } 8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (is_supported) 8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(&max_maps[num_intf++], &p_maps[xx], sizeof(tNFC_DISCOVER_MAPS)); 8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 8566767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(WARNING) << StringPrintf( 8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "NFC_DiscoveryMap interface=0x%x is not supported by NFCC", 8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_maps[xx].intf_type); 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return nci_snd_discover_map_cmd(num_intf, (tNCI_DISCOVER_MAPS*)max_maps); 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_DiscoveryStart 868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to start Polling and/or Listening. 870552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** The response from NFCC is reported by tNFC_DISCOVER_CBACK as 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_START_DEVT. The notification from NFCC is reported by 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tNFC_DISCOVER_CBACK as NFC_RESULT_DEVT. 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters num_params - the number of items in p_params. 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_params - the discovery parameters 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_cback - the discovery callback function 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 8816fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_DiscoveryStart(uint8_t num_params, 8826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_DISCOVER_PARAMS* p_params, 8836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_DISCOVER_CBACK* p_cback) { 8846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 8856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int params_size; 8866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS status = NFC_STATUS_NO_BUFFERS; 8876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << __func__; 8896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.p_disc_pending) { 8906767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("There's pending NFC_DiscoveryStart"); 8916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFC_STATUS_BUSY; 8926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_discv_cback = p_cback; 8946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags |= NFC_FL_DISCOVER_PENDING; 8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED; 8966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi params_size = sizeof(tNFC_DISCOVER_PARAMS) * num_params; 8976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_disc_pending = 8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_getbuf((uint16_t)(NFC_HDR_SIZE + 1 + params_size)); 8996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.p_disc_pending) { 9006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)nfc_cb.p_disc_pending; 9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p++ = num_params; 9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(p, p_params, params_size); 9036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFC_STATUS_CMD_STARTED; 9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ncif_check_cmd_queue(NULL); 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 9086767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 9096767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("NFC_DiscoveryStart status: 0x%x", status); 9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_DiscoverySelect 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT, 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** the application needs to use this function to select the 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** the logical endpoint to continue. The response from NFCC is 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT. 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters rf_disc_id - The ID identifies the remote device. 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** protocol - the logical endpoint on the remote devide 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** rf_interface - the RF interface to communicate with NFCC 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 9296fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_DiscoverySelect(uint8_t rf_disc_id, uint8_t protocol, 9306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t rf_interface) { 9316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return nci_snd_discover_select_cmd(rf_disc_id, protocol, rf_interface); 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_ConnCreate 937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to create a logical connection with 939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFCC for data exchange. 940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters dest_type - the destination type 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** id - the NFCEE ID or RF Discovery ID . 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** protocol - the protocol. 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_cback - the connection callback function 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_ConnCreate(uint8_t dest_type, uint8_t id, uint8_t protocol, 9506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN_CBACK* p_cback) { 9516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS status = NFC_STATUS_FAILED; 9526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN_CB* p_cb; 9536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_tlv = 0, tlv_size = 0; 9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t param_tlvs[4], *pp; 9556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb = nfc_alloc_conn_cb(p_cback); 9576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb) { 9586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->id = id; 9596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi pp = param_tlvs; 9606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (dest_type == NCI_DEST_TYPE_NFCEE) { 9616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi num_tlv = 1; 9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_NFCEE_VAL); 9636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(pp, 2); 9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(pp, id); 9656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(pp, protocol); 9666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tlv_size = 4; 9676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (dest_type == NCI_DEST_TYPE_REMOTE) { 9686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi num_tlv = 1; 9696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_RF_DISC_ID); 9706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(pp, 1); 9716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(pp, id); 9726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tlv_size = 3; 9736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (dest_type == NCI_DEST_TYPE_NFCC) { 9746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->id = NFC_TEST_ID; 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 9766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add handling of NCI_DEST_TYPE_REMOTE when more RF interface definitions 9776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * are added */ 9786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->act_protocol = protocol; 9796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_cback = p_cback; 9806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = nci_snd_core_conn_create(dest_type, num_tlv, tlv_size, param_tlvs); 9816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (status == NFC_STATUS_FAILED) nfc_free_conn_cb(p_cb); 9826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_ConnClose 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to close a logical connection with 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFCC. 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters conn_id - the connection id. 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 9986fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_ConnClose(uint8_t conn_id) { 9996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id); 10006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS status = NFC_STATUS_FAILED; 10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb) { 10036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = nci_snd_core_conn_close(conn_id); 10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 10056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_SetStaticRfCback 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to update the data callback function 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** to receive the data for the given connection id. 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters p_cback - the connection callback function 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 10206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid NFC_SetStaticRfCback(tNFC_CONN_CBACK* p_cback) { 10216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_cback = p_cback; 10246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* just in case DH has received NCI data before the data callback is set 10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * check if there's any data event to report on this connection id */ 10266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_data_event(p_cb); 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1031a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function NFC_SetReassemblyFlag 1032a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1033a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description This function is called to set if nfc will reassemble 1034a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** nci packet as much as its buffer can hold or it should not 1035552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** reassemble but forward the fragmented nci packet to layer 1036552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** above. If nci data pkt is fragmented, nfc may send multiple 1037a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** NFC_DATA_CEVT with status NFC_STATUS_CONTINUE before sending 1038a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** NFC_DATA_CEVT with status NFC_STATUS_OK based on reassembly 1039a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** configuration and reassembly buffer size 1040a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1041a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Parameters reassembly - flag to indicate if nfc may reassemble or not 1042a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1043a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns Nothing 1044a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1045a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/ 10466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid NFC_SetReassemblyFlag(bool reassembly) { nfc_cb.reassembly = reassembly; } 1047a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 1048a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/******************************************************************************* 1049a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_SendData 1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to send the given data packet 1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** to the connection identified by the given connection id. 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters conn_id - the connection id. 1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_data - the data packet. 1057552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** p_data->offset must be >= NCI_MSG_OFFSET_SIZE + 1058552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** NCI_DATA_HDR_SIZE 1059552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** The data payload starts at 1060552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** ((uint8_t *) (p_data + 1) + p_data->offset) 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 10656fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_SendData(uint8_t conn_id, NFC_HDR* p_data) { 10666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS status = NFC_STATUS_FAILED; 10676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id); 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb && p_data && 10706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_data->offset >= NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE) { 10716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = nfc_ncif_send_data(p_cb, p_data); 10726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (status != NFC_STATUS_OK) GKI_freebuf(p_data); 10756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_FlushData 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to discard the tx data queue of 1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** the given connection id. 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters conn_id - the connection id. 1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 10916fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_FlushData(uint8_t conn_id) { 10926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS status = NFC_STATUS_FAILED; 10936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id); 10946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi void* p_buf; 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb) { 10976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFC_STATUS_OK; 10986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi while ((p_buf = GKI_dequeue(&p_cb->tx_q)) != NULL) GKI_freebuf(p_buf); 10996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_Deactivate 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to stop the discovery process or 1109552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** put the listen device in sleep mode or terminate the NFC 1110552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** link. 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The response from NFCC is reported by tNFC_DISCOVER_CBACK 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** as NFC_DEACTIVATE_DEVT. 1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters deactivate_type - NFC_DEACTIVATE_TYPE_IDLE, to IDLE mode. 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_DEACTIVATE_TYPE_SLEEP to SLEEP mode. 1117552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** NFC_DEACTIVATE_TYPE_SLEEP_AF to SLEEP_AF 1118552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** mode. 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 11236fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_Deactivate(tNFC_DEACT_TYPE deactivate_type) { 11246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; 11256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS status = NFC_STATUS_OK; 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 11276767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 11286767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "NFC_Deactivate %d (%s) deactivate_type:%d", nfc_cb.nfc_state, 11296767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi nfc_state_name(nfc_cb.nfc_state).c_str(), deactivate_type); 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 11316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) { 11326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* the HAL pre-discover is still active - clear the pending flag */ 11336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING; 11346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (!(nfc_cb.flags & NFC_FL_HAL_REQUESTED)) { 11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* if HAL did not request for control, clear this bit now */ 11366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags &= ~NFC_FL_CONTROL_REQUESTED; 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 11386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(nfc_cb.p_disc_pending); 11396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_disc_pending = NULL; 11406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_OK; 11416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.nfc_state == NFC_STATE_OPEN) { 11446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_CLOSING); 11456767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 11466767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("act_protocol %d credits:%d/%d", p_cb->act_protocol, 11476767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi p_cb->init_credits, p_cb->num_buff); 11486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->act_protocol == NCI_PROTOCOL_NFC_DEP) && 11496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->init_credits != p_cb->num_buff)) { 11506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags |= NFC_FL_DEACTIVATING; 11516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.deactivate_timer.param = (uintptr_t)deactivate_type; 11526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_start_timer(&nfc_cb.deactivate_timer, 11536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (uint16_t)(NFC_TTYPE_WAIT_2_DEACTIVATE), 11546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_DEACTIVATE_TIMEOUT); 11556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 11576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 11596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = nci_snd_deactivate_cmd(deactivate_type); 11606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 11625e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna/******************************************************************************* 11635e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** 11645e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** Function NFC_SetPowerSubState 11655e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** 11665e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** Description This function is called to send the power sub state (screen 11675e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** state) to NFCC. The response from NFCC is reported by 11685e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** tNFC_RESPONSE_CBACK as NFC_SET_POWER_STATE_REVT. 11695e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** 11705e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** Parameters scree_state 11715e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** 11725e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** Returns tNFC_STATUS 11735e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna** 11745e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna*******************************************************************************/ 11755e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love KhannatNFC_STATUS NFC_SetPowerSubState(uint8_t screen_state) { 11765e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna return nci_snd_core_set_power_sub_state(screen_state); 11775e4b4d7eb1ce345c12131ca948f31e1b7b9e0256Love Khanna} 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_UpdateRFCommParams 1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1182552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description This function is called to update RF Communication 1183552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** parameters once the Frame RF Interface has been activated. 1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The response from NFCC is reported by tNFC_RESPONSE_CBACK 1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** as NFC_RF_COMM_PARAMS_UPDATE_REVT. 1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 11916fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_UpdateRFCommParams(tNFC_RF_COMM_PARAMS* p_params) { 11926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t tlvs[12]; 11936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p = tlvs; 11946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t data_exch_config; 11956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* RF Technology and Mode */ 11976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_params->include_rf_tech_mode) { 11986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TECH_N_MODE); 11996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); 12006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_params->rf_tech_n_mode); 12016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Transmit Bit Rate */ 12046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_params->include_tx_bit_rate) { 12056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TX_BIT_RATE); 12066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); 12076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_params->tx_bit_rate); 12086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Receive Bit Rate */ 12116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_params->include_tx_bit_rate) { 12126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_RX_BIT_RATE); 12136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); 12146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_params->rx_bit_rate); 12156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* NFC-B Data Exchange Configuration */ 12186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_params->include_nfc_b_config) { 12196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_B_DATA_EX_PARAM); 12206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); 12216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data_exch_config = (p_params->min_tr0 & 0x03) << 6; /* b7b6 : Mininum TR0 */ 12236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data_exch_config |= (p_params->min_tr1 & 0x03) 12246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi << 4; /* b5b4 : Mininum TR1 */ 12256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data_exch_config |= (p_params->suppression_eos & 0x01) 12266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi << 3; /* b3 : Suppression of EoS */ 12276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data_exch_config |= (p_params->suppression_sos & 0x01) 12286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi << 2; /* b2 : Suppression of SoS */ 12296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data_exch_config |= (p_params->min_tr2 & 0x03); /* b1b0 : Mininum TR2 */ 12306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, data_exch_config); 12326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return nci_snd_parameter_update_cmd(tlvs, (uint8_t)(p - tlvs)); 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_SetPowerOffSleep 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function closes/opens transport and turns off/on NFCC. 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 12466fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_SetPowerOffSleep(bool enable) { 12476767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("enable = %d", enable); 1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((enable == false) && 12506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) { 12516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags |= NFC_FL_RESTARTING; 1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* open transport */ 12546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_set_state(NFC_STATE_W4_HAL_OPEN); 12556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback); 1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_OK; 12586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if ((enable == true) && (nfc_cb.nfc_state == NFC_STATE_IDLE)) { 12596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* close transport to turn off NFCC and clean up */ 12606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP; 12616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_task_shutdown_nfcc(); 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_OK; 12646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12666767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("invalid state = %d", nfc_cb.nfc_state); 12676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_FAILED; 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_PowerCycleNFCC 1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function turns off and then on NFCC. 1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 12796fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS NFC_PowerCycleNFCC(void) { 12806767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfc_cb.nfc_state == NFC_STATE_IDLE) { 12836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* power cycle NFCC */ 12846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_cb.flags |= NFC_FL_POWER_CYCLE_NFCC; 12856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_task_shutdown_nfcc(); 1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_OK; 12886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12906767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("invalid state = %d", nfc_cb.nfc_state); 12916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_FAILED; 1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 12963f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi** Function NFC_GetNCIVersion 12973f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi** 12983f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi** Description Called by higher layer to get the current nci 12993f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi** version of nfc. 13003f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi** 13013f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi** Returns NCI version NCI2.0 / NCI1.0 13023f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi** 13033f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi*******************************************************************************/ 13043f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoiuint8_t NFC_GetNCIVersion() { return nfc_cb.nci_version; } 13053f64b002fc7bea3004fcce63a1a503f67d69ba9bRuchi Kandoi 1306d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna/******************************************************************************* 1307d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** 1308d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** Function NFC_ISODEPNakPresCheck 1309d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** 1310d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** Description This function is called to send the ISO DEP nak presenc 1311d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** check cmd to check that the remote end point in RF field. 1312d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** 1313d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** The response from NFCC is reported by call back.The ntf 1314d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** indicates success if card is present in field or failed 1315d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** if card is lost. 1316d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** 1317d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** Returns tNFC_STATUS 1318d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna** 1319d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna*******************************************************************************/ 1320d09d4bf1d5335cba9858a1e526ed095dcdb76676Love KhannatNFC_STATUS NFC_ISODEPNakPresCheck() { 1321d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna return nci_snd_iso_dep_nak_presence_check_cmd(); 1322d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna} 1323d09d4bf1d5335cba9858a1e526ed095dcdb76676Love Khanna 132481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna/******************************************************************************* 132581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** 132681e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** Function NFC_SetStaticHciCback 132781e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** 132881e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** Description This function is called to update the data callback function 132981e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** to receive the data for the static Hci connection id. 133081e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** 133181e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** Parameters p_cback - the connection callback function 133281e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** 133381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** Returns Nothing 133481e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna** 133581e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna*******************************************************************************/ 133681e4f816534a9d9137ce202d1b158720cc13eb78Love Khannavoid NFC_SetStaticHciCback(tNFC_CONN_CBACK* p_cback) { 13376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 13386767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("%s dest: %d", __func__, NCI_DEST_TYPE_NFCEE); 133981e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID]; 134081e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna tNFC_CONN evt_data; 134181e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna 134281e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna p_cb->p_cback = p_cback; 134381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna if (p_cback && p_cb->buff_size && p_cb->num_buff) { 13446767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 13456767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("%s dest: %d", __func__, NCI_DEST_TYPE_NFCEE); 134681e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna evt_data.conn_create.status = NFC_STATUS_OK; 134781e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna evt_data.conn_create.dest_type = NCI_DEST_TYPE_NFCEE; 134881e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna evt_data.conn_create.id = p_cb->id; 134981e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna evt_data.conn_create.buff_size = p_cb->buff_size; 135081e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna evt_data.conn_create.num_buffs = p_cb->num_buff; 135181e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna (*p_cback)(NFC_HCI_CONN_ID, NFC_CONN_CREATE_CEVT, &evt_data); 135281e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna } 135381e4f816534a9d9137ce202d1b158720cc13eb78Love Khanna} 13546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi 1355a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/******************************************************************************* 1356a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1357a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function NFC_GetStatusName 1358a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1359a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description This function returns the status name. 1360a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1361a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** NOTE conditionally compiled to save memory. 1362a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1363a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns pointer to the name 1364a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 1365a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/ 13667dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoistd::string NFC_GetStatusName(tNFC_STATUS status) { 13676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (status) { 1368a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_OK: 13696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "OK"; 1370a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_REJECTED: 13716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "REJECTED"; 1372a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_MSG_CORRUPTED: 13736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "CORRUPTED"; 1374a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_BUFFER_FULL: 13756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "BUFFER_FULL"; 1376a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_FAILED: 13776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "FAILED"; 1378a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_NOT_INITIALIZED: 13796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "NOT_INITIALIZED"; 1380a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_SYNTAX_ERROR: 13816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "SYNTAX_ERROR"; 1382a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_SEMANTIC_ERROR: 13836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "SEMANTIC_ERROR"; 1384a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_UNKNOWN_GID: 13856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "UNKNOWN_GID"; 1386a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_UNKNOWN_OID: 13876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "UNKNOWN_OID"; 1388a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_INVALID_PARAM: 13896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "INVALID_PARAM"; 1390a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_MSG_SIZE_TOO_BIG: 13916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "MSG_SIZE_TOO_BIG"; 1392a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_ALREADY_STARTED: 13936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "ALREADY_STARTED"; 1394a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_ACTIVATION_FAILED: 13956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "ACTIVATION_FAILED"; 1396a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_TEAR_DOWN: 13976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "TEAR_DOWN"; 1398a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_RF_TRANSMISSION_ERR: 13996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RF_TRANSMISSION_ERR"; 1400a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_RF_PROTOCOL_ERR: 14016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RF_PROTOCOL_ERR"; 1402a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_TIMEOUT: 14036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "TIMEOUT"; 1404a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_EE_INTF_ACTIVE_FAIL: 14056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "EE_INTF_ACTIVE_FAIL"; 1406a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_EE_TRANSMISSION_ERR: 14076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "EE_TRANSMISSION_ERR"; 1408a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_EE_PROTOCOL_ERR: 14096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "EE_PROTOCOL_ERR"; 1410a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_EE_TIMEOUT: 14116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "EE_TIMEOUT"; 1412a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_CMD_STARTED: 14136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "CMD_STARTED"; 1414a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_HW_TIMEOUT: 14156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "HW_TIMEOUT"; 1416a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_CONTINUE: 14176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "CONTINUE"; 1418a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_REFUSED: 14196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "REFUSED"; 1420a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_BAD_RESP: 14216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "BAD_RESP"; 1422a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_CMD_NOT_CMPLTD: 14236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "CMD_NOT_CMPLTD"; 1424a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_NO_BUFFERS: 14256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "NO_BUFFERS"; 1426a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_WRONG_PROTOCOL: 14276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "WRONG_PROTOCOL"; 1428a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_BUSY: 14296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "BUSY"; 1430a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_LINK_LOSS: 14316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "LINK_LOSS"; 1432a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_BAD_LENGTH: 14336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "BAD_LENGTH"; 1434a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_BAD_HANDLE: 14356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "BAD_HANDLE"; 1436a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case NFC_STATUS_CONGESTED: 14376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "CONGESTED"; 1438a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu default: 14396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "UNKNOWN"; 14406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1441a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu} 1442