1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2009-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 interface with the NFC NCI transport.
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  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 "nfc_target.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE)
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_hmsgs.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ce_api.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ce_int.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttCE_CB  ce_cb;
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid ce_init (void)
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (&ce_cb, 0, sizeof (tCE_CB));
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ce_cb.trace_level = NFC_INITIAL_TRACE_LEVEL;
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Initialize tag-specific fields of ce control block */
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ce_t3t_init ();
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_SendRawFrame
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sends a raw frame to the peer device.
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_SendRawFrame (UINT8 *p_raw_data, UINT16 data_len)
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status = NFC_STATUS_FAILED;
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR  *p_data;
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   *p;
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (ce_cb.p_cback)
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* a valid opcode for RW */
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_data = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID);
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_data)
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_data->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p = (UINT8 *) (p_data + 1) + p_data->offset;
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (p, p_raw_data, data_len);
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_data->len = data_len;
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_EVENT1 ("CE SENT raw frame (0x%x)", data_len);
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = NFC_SendData (NFC_RF_CONN_ID, p_data);
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_SetActivatedTagType
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function selects the tag type for CE mode.
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_SetActivatedTagType (tNFC_ACTIVATE_DEVT *p_activate_params, UINT16 t3t_system_code, tCE_CBACK *p_cback)
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status = NFC_STATUS_FAILED;
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_PROTOCOL protocol = p_activate_params->protocol;
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_API1 ("CE_SetActivatedTagType protocol:%d", protocol);
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (protocol)
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_PROTOCOL_T1T:
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_PROTOCOL_T2T:
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_FAILED;
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_PROTOCOL_T3T:   /* Type3Tag    - NFC-F */
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* store callback function before NFC_SetStaticRfCback () */
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.p_cback  = p_cback;
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = ce_select_t3t (t3t_system_code, p_activate_params->rf_tech_param.param.lf.nfcid2);
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_PROTOCOL_ISO_DEP:     /* ISODEP/4A,4B- NFC-A or NFC-B */
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* store callback function before NFC_SetStaticRfCback () */
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.p_cback  = p_cback;
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = ce_select_t4t ();
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CE_SetActivatedTagType Invalid protocol");
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_FAILED;
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status != NFC_STATUS_OK)
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_SetStaticRfCback (NULL);
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.p_cback  = NULL;
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_SetTraceLevel
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sets the trace level for Card Emulation mode.
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  If called with a value of 0xFF,
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  it simply returns the current trace level.
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          The new or current trace level
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 CE_SetTraceLevel (UINT8 new_level)
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (new_level != 0xFF)
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.trace_level = new_level;
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (ce_cb.trace_level);
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* NFC_INCLUDED == TRUE */
151