1/******************************************************************************
2 *
3 *  Copyright (C) 2009-2014 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 *  This file contains functions that interface with the NFC NCI transport.
22 *  On the receive side, it routes events to the appropriate handler
23 *  (callback). On the transmit side, it manages the command transmission.
24 *
25 ******************************************************************************/
26#include <string.h>
27
28#include <android-base/stringprintf.h>
29#include <base/logging.h>
30
31#include "nfc_target.h"
32
33#include "bt_types.h"
34#include "ce_api.h"
35#include "ce_int.h"
36
37using android::base::StringPrintf;
38
39extern bool nfc_debug_enabled;
40
41tCE_CB ce_cb;
42
43/*******************************************************************************
44*******************************************************************************/
45void ce_init(void) {
46  memset(&ce_cb, 0, sizeof(tCE_CB));
47
48  /* Initialize tag-specific fields of ce control block */
49  ce_t3t_init();
50}
51
52/*******************************************************************************
53**
54** Function         CE_SendRawFrame
55**
56** Description      This function sends a raw frame to the peer device.
57**
58** Returns          tNFC_STATUS
59**
60*******************************************************************************/
61tNFC_STATUS CE_SendRawFrame(uint8_t* p_raw_data, uint16_t data_len) {
62  tNFC_STATUS status = NFC_STATUS_FAILED;
63  NFC_HDR* p_data;
64  uint8_t* p;
65
66  if (ce_cb.p_cback) {
67    /* a valid opcode for RW */
68    p_data = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
69    if (p_data) {
70      p_data->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
71      p = (uint8_t*)(p_data + 1) + p_data->offset;
72      memcpy(p, p_raw_data, data_len);
73      p_data->len = data_len;
74      DLOG_IF(INFO, nfc_debug_enabled)
75          << StringPrintf("CE SENT raw frame (0x%x)", data_len);
76      status = NFC_SendData(NFC_RF_CONN_ID, p_data);
77    }
78  }
79  return status;
80}
81
82/*******************************************************************************
83**
84** Function         CE_SetActivatedTagType
85**
86** Description      This function selects the tag type for CE mode.
87**
88** Returns          tNFC_STATUS
89**
90*******************************************************************************/
91tNFC_STATUS CE_SetActivatedTagType(tNFC_ACTIVATE_DEVT* p_activate_params,
92                                   uint16_t t3t_system_code,
93                                   tCE_CBACK* p_cback) {
94  tNFC_STATUS status = NFC_STATUS_FAILED;
95  tNFC_PROTOCOL protocol = p_activate_params->protocol;
96
97  DLOG_IF(INFO, nfc_debug_enabled)
98      << StringPrintf("CE_SetActivatedTagType protocol:%d", protocol);
99
100  switch (protocol) {
101    case NFC_PROTOCOL_T1T:
102    case NFC_PROTOCOL_T2T:
103      return NFC_STATUS_FAILED;
104
105    case NFC_PROTOCOL_T3T: /* Type3Tag    - NFC-F */
106      /* store callback function before NFC_SetStaticRfCback () */
107      ce_cb.p_cback = p_cback;
108      status = ce_select_t3t(t3t_system_code,
109                             p_activate_params->rf_tech_param.param.lf.nfcid2);
110      break;
111
112    case NFC_PROTOCOL_ISO_DEP: /* ISODEP/4A,4B- NFC-A or NFC-B */
113      /* store callback function before NFC_SetStaticRfCback () */
114      ce_cb.p_cback = p_cback;
115      status = ce_select_t4t();
116      break;
117
118    default:
119      LOG(ERROR) << StringPrintf("CE_SetActivatedTagType Invalid protocol");
120      return NFC_STATUS_FAILED;
121  }
122
123  if (status != NFC_STATUS_OK) {
124    NFC_SetStaticRfCback(NULL);
125    ce_cb.p_cback = NULL;
126  }
127  return status;
128}
129