ce_main.c revision 5c65c3a0f42e174e47fecd4e569606003217ff4e
168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/****************************************************************************** 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Copyright (C) 2009-2013 Broadcom Corporation 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * you may not use this file except in compliance with the License. 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * You may obtain a copy of the License at: 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * See the License for the specific language governing permissions and 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * limitations under the License. 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ******************************************************************************/ 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/****************************************************************************** 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * This file contains functions that interface with the NFC NCI transport. 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * On the receive side, it routes events to the appropriate handler 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * (callback). On the transmit side, it manages the command transmission. 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ******************************************************************************/ 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <string.h> 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "nfc_target.h" 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "bt_types.h" 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if (NFC_INCLUDED == TRUE) 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "nfc_api.h" 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "nci_hmsgs.h" 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ce_api.h" 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ce_int.h" 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "gki.h" 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)tCE_CB ce_cb; 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/******************************************************************************* 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)*******************************************************************************/ 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ce_init (void) 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles){ 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) memset (&ce_cb, 0, sizeof (tCE_CB)); 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ce_cb.trace_level = NFC_INITIAL_TRACE_LEVEL; 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /* Initialize tag-specific fields of ce control block */ 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ce_t3t_init (); 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/******************************************************************************* 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** Function CE_SendRawFrame 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** Description This function sends a raw frame to the peer device. 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** Returns tNFC_STATUS 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)*******************************************************************************/ 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)tNFC_STATUS CE_SendRawFrame (UINT8 *p_raw_data, UINT16 data_len) 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles){ 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) tNFC_STATUS status = NFC_STATUS_FAILED; 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) BT_HDR *p_data; 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UINT8 *p; 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (ce_cb.p_cback) 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /* a valid opcode for RW */ 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) p_data = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (p_data) 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) p_data->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) p = (UINT8 *) (p_data + 1) + p_data->offset; 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) memcpy (p, p_raw_data, data_len); 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) p_data->len = data_len; 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CE_TRACE_EVENT1 ("CE SENT raw frame (0x%x)", data_len); 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) status = NFC_SendData (NFC_RF_CONN_ID, p_data); 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return status; 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/******************************************************************************* 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** Function CE_SetActivatedTagType 8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** Description This function selects the tag type for CE mode. 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** Returns tNFC_STATUS 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)*******************************************************************************/ 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)tNFC_STATUS CE_SetActivatedTagType (tNFC_ACTIVATE_DEVT *p_activate_params, UINT16 t3t_system_code, tCE_CBACK *p_cback) 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles){ 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) tNFC_STATUS status = NFC_STATUS_FAILED; 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) tNFC_PROTOCOL protocol = p_activate_params->protocol; 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CE_TRACE_API1 ("CE_SetActivatedTagType protocol:%d", protocol); 9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (protocol) 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case NFC_PROTOCOL_T1T: 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case NFC_PROTOCOL_T2T: 10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return NFC_STATUS_FAILED; 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case NFC_PROTOCOL_T3T: /* Type3Tag - NFC-F */ 10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /* store callback function before NFC_SetStaticRfCback () */ 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ce_cb.p_cback = p_cback; 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) status = ce_select_t3t (t3t_system_code, p_activate_params->rf_tech_param.param.lf.nfcid2); 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case NFC_PROTOCOL_ISO_DEP: /* ISODEP/4A,4B- NFC-A or NFC-B */ 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /* store callback function before NFC_SetStaticRfCback () */ 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ce_cb.p_cback = p_cback; 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) status = ce_select_t4t (); 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) default: 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CE_TRACE_ERROR0 ("CE_SetActivatedTagType Invalid protocol"); 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return NFC_STATUS_FAILED; 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (status != NFC_STATUS_OK) 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NFC_SetStaticRfCback (NULL); 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ce_cb.p_cback = NULL; 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return status; 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/******************************************************************************* 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** Function CE_SetTraceLevel 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** Description This function sets the trace level for Card Emulation mode. 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** If called with a value of 0xFF, 13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** it simply returns the current trace level. 13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** Returns The new or current trace level 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)** 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)*******************************************************************************/ 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)UINT8 CE_SetTraceLevel (UINT8 new_level) 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles){ 14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (new_level != 0xFF) 14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ce_cb.trace_level = new_level; 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return (ce_cb.trace_level); 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif /* NFC_INCLUDED == TRUE */ 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)