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 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains functions that NCI vendor specific interface with the 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * NFCC. On the receive side, it routes events to the appropriate handler 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * (callback). On the transmit side, it manages the command transmission. 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE) 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h" 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/**************************************************************************** 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Declarations 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project****************************************************************************/ 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function NFC_RegVSCback 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to register or de-register a callback 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** function to receive Proprietary NCI response and notification 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** events. 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The maximum number of callback functions allowed is NFC_NUM_VS_CBACKS 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS NFC_RegVSCback (BOOLEAN is_register, 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_VS_CBACK *p_cback) 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int i; 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (is_register) 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i = 0; i < NFC_NUM_VS_CBACKS; i++) 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* find an empty spot to hold the callback function */ 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_cb.p_vs_cb[i] == NULL) 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_cb.p_vs_cb[i] = p_cback; 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_OK; 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i = 0; i < NFC_NUM_VS_CBACKS; i++) 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* find the callback to de-register */ 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_cb.p_vs_cb[i] == p_cback) 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_cb.p_vs_cb[i] = NULL; 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_OK; 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 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_SendVsCommand 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to send the given vendor specific 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** command to NFCC. The response from NFCC is reported to the 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** given tNFC_VS_CBACK as (oid). 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters oid - The opcode of the VS command. 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_data - The parameters for the VS command 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS NFC_SendVsCommand (UINT8 oid, 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_data, 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_VS_CBACK *p_cback) 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_OK; 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *pp; 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Allow VSC with 0-length payload */ 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_data == NULL) 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data = NCI_GET_CMD_BUF (0); 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_data) 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data->offset = NCI_VSC_MSG_HDR_SIZE; 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data->len = 0; 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate parameters */ 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_data == NULL) || (p_data->offset < NCI_VSC_MSG_HDR_SIZE) || (p_data->len > NCI_MAX_VSC_SIZE)) 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_TRACE_ERROR1 ("buffer offset must be >= %d", NCI_VSC_MSG_HDR_SIZE); 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_data) 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_data); 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_INVALID_PARAM; 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data->event = BT_EVT_TO_NFC_NCI; 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data->layer_specific = NFC_WAIT_RSP_VSC; 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* save the callback function in the BT_HDR, to receive the response */ 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((tNFC_NCI_VS_MSG *) p_data)->p_cback = p_cback; 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data->offset -= NCI_MSG_HDR_SIZE; 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pp = (UINT8 *) (p_data + 1) + p_data->offset; 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_PROP); 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_BLD_HDR1 (pp, oid); 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *pp = (UINT8) p_data->len; 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data->len += NCI_MSG_HDR_SIZE; 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_ncif_check_cmd_queue (p_data); 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* NFC_INCLUDED == TRUE */ 148