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