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