blob: 46e6955d7b19b0f8601ccc8ad50fa395dea0f3d8 [file] [log] [blame]
nxpandroidc7611652015-09-23 16:42:05 +05301/******************************************************************************
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
nxpandroidc7611652015-09-23 16:42:05 +053019/******************************************************************************
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>
nxpandroidc7611652015-09-23 16:42:05 +053027
nxf24591c1cbeab2018-02-21 17:32:26 +053028#include <android-base/stringprintf.h>
29#include <base/logging.h>
30
31#include "nfc_target.h"
32
33#include "bt_types.h"
nxpandroidc7611652015-09-23 16:42:05 +053034#include "ce_api.h"
35#include "ce_int.h"
nxf24591c1cbeab2018-02-21 17:32:26 +053036
37using android::base::StringPrintf;
38
39extern bool nfc_debug_enabled;
nxpandroidc7611652015-09-23 16:42:05 +053040
nxpandroid8f6d0532017-07-12 18:25:30 +053041tCE_CB ce_cb;
nxpandroidc7611652015-09-23 16:42:05 +053042
43/*******************************************************************************
44*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +053045void ce_init(void) {
46 memset(&ce_cb, 0, sizeof(tCE_CB));
nxpandroidc7611652015-09-23 16:42:05 +053047
nxpandroid8f6d0532017-07-12 18:25:30 +053048 /* Initialize tag-specific fields of ce control block */
49 ce_t3t_init();
nxpandroidc7611652015-09-23 16:42:05 +053050}
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*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +053061tNFC_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;
nxpandroidc7611652015-09-23 16:42:05 +053065
nxpandroid8f6d0532017-07-12 18:25:30 +053066 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;
nxf24591c1cbeab2018-02-21 17:32:26 +053074 DLOG_IF(INFO, nfc_debug_enabled)
75 << StringPrintf("CE SENT raw frame (0x%x)", data_len);
nxpandroid8f6d0532017-07-12 18:25:30 +053076 status = NFC_SendData(NFC_RF_CONN_ID, p_data);
nxpandroidc7611652015-09-23 16:42:05 +053077 }
nxpandroid8f6d0532017-07-12 18:25:30 +053078 }
79 return status;
nxpandroidc7611652015-09-23 16:42:05 +053080}
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*******************************************************************************/
nxpandroid8f6d0532017-07-12 18:25:30 +053091tNFC_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;
nxpandroidc7611652015-09-23 16:42:05 +053096
nxf24591c1cbeab2018-02-21 17:32:26 +053097 DLOG_IF(INFO, nfc_debug_enabled)
98 << StringPrintf("CE_SetActivatedTagType protocol:%d", protocol);
nxpandroidc7611652015-09-23 16:42:05 +053099
nxpandroid8f6d0532017-07-12 18:25:30 +0530100 switch (protocol) {
nxpandroidc7611652015-09-23 16:42:05 +0530101 case NFC_PROTOCOL_T1T:
102 case NFC_PROTOCOL_T2T:
nxpandroid8f6d0532017-07-12 18:25:30 +0530103 return NFC_STATUS_FAILED;
nxpandroidc7611652015-09-23 16:42:05 +0530104
nxpandroid8f6d0532017-07-12 18:25:30 +0530105 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;
nxpandroidc7611652015-09-23 16:42:05 +0530111
nxpandroid8f6d0532017-07-12 18:25:30 +0530112 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;
nxpandroidc7611652015-09-23 16:42:05 +0530117
118 default:
nxf24591c1cbeab2018-02-21 17:32:26 +0530119 LOG(ERROR) << StringPrintf("CE_SetActivatedTagType Invalid protocol");
nxpandroid8f6d0532017-07-12 18:25:30 +0530120 return NFC_STATUS_FAILED;
121 }
nxpandroidc7611652015-09-23 16:42:05 +0530122
nxpandroid8f6d0532017-07-12 18:25:30 +0530123 if (status != NFC_STATUS_OK) {
124 NFC_SetStaticRfCback(NULL);
125 ce_cb.p_cback = NULL;
126 }
127 return status;
nxpandroidc7611652015-09-23 16:42:05 +0530128}