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