1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2012-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 *  NFC Hardware Abstraction Layer API: Implementation for Broadcom NFC
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  controllers
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include <string.h>
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_target.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_api.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_TASK declarations
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_TASK_STR            ((INT8 *) "NFC_HAL_TASK")
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_TASK_STACK_SIZE     0x400
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 nfc_hal_task_stack[(NFC_HAL_TASK_STACK_SIZE+3)/4];
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcInitialize
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Called when HAL library is loaded.
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Initialize GKI and start the HCIT task
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcInitialize (void)
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Initialize HAL control block */
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_hal_main_init ();
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen   HAL_TRACE_API1 ("HAL_NfcInitialize (): NFC_HAL_TASK id=%i", NFC_HAL_TASK);
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifndef NFC_HAL_SHARED_GKI
595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Initialize GKI (not needed if using shared NFC/HAL GKI resources) */
605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    GKI_init ();
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_enable ();
625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Create the NCI transport task */
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_create_task ((TASKPTR)nfc_hal_main_task,
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     NFC_HAL_TASK,
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     NFC_HAL_TASK_STR,
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     (UINT16 *) ((UINT8 *)nfc_hal_task_stack + NFC_HAL_TASK_STACK_SIZE),
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     sizeof(nfc_hal_task_stack), NULL, NULL);
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifndef NFC_HAL_SHARED_GKI
725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Start GKI scheduler (not needed if using shared NFC/HAL GKI resources) */
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_run (0);
745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcTerminate
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Called to terminate NFC HAL
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcTerminate(void)
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_API0 ("HAL_NfcTerminate ()");
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcOpen
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Open transport and intialize the NFCC, and
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Register callback for HAL event notifications,
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  HAL_OPEN_CPLT_EVT will notify when operation is complete.
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcOpen (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK *p_data_cback)
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_API0 ("HAL_NfcOpen ()");
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Only handle if HAL is not opened (stack cback is NULL) */
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_hal_cback)
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_dm_init ();
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.p_stack_cback = p_hal_cback;
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.p_data_cback  = p_data_cback;
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Send startup event to NFC_HAL_TASK */
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_INITIALIZE);
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcClose
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Prepare for shutdown. A HAL_CLOSE_DONE_EVENT will be
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  reported when complete.
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcClose (void)
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_API0 ("HAL_NfcClose ()");
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Only handle if HAL is opened (stack cback is not-NULL) */
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.p_stack_cback)
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Send shutdown event to NFC_HAL_TASK */
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_TERMINATE);
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcCoreInitialized
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Called after the CORE_INIT_RSP is received from the NFCC.
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  At this time, the HAL can do any chip-specific configuration,
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  and when finished signal the libnfc-nci with event
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  HAL_POST_INIT_DONE.
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcCoreInitialized (UINT8 *p_core_init_rsp_params)
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HDR *p_msg;
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16  size;
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_API0 ("HAL_NfcCoreInitialized ()");
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* NCI payload len + NCI header size */
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    size = p_core_init_rsp_params[2] + NCI_MSG_HDR_SIZE;
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Send message to NFC_HAL_TASK */
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_msg = (NFC_HDR *)GKI_getbuf ((UINT16)(size + NFC_HDR_SIZE))) != NULL)
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->event  = NFC_HAL_EVT_POST_CORE_RESET;
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->offset = 0;
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->len    = size;
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->layer_specific = 0;
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy ((UINT8 *)(p_msg + 1) + p_msg->offset, p_core_init_rsp_params, size);
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcWrite
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send an NCI control message or data packet to the
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  transport. If an NCI command message exceeds the transport
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  size, HAL is responsible for fragmenting it, Data packets
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  must be of the correct size.
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcWrite (UINT16 data_len, UINT8 *p_data)
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HDR *p_msg;
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 mt;
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_API0 ("HAL_NfcWrite ()");
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (data_len > (NCI_MAX_CTRL_SIZE + NCI_MSG_HDR_SIZE))
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_ERROR1 ("HAL_NfcWrite (): too many bytes (%d)", data_len);
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Send message to NFC_HAL_TASK */
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->event  = NFC_HAL_EVT_TO_NFC_NCI;
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE;
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->len    = data_len;
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy ((UINT8 *)(p_msg+1) + p_msg->offset, p_data, data_len);
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Check if message is a command or data */
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mt = (*(p_data) & NCI_MT_MASK) >> NCI_MT_SHIFT;
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->layer_specific = (mt == NCI_MT_CMD) ? NFC_HAL_WAIT_RSP_CMD : 0;
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcPreDiscover
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Perform any vendor-specific pre-discovery actions (if needed)
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  If any actions were performed TRUE will be returned, and
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  HAL_PRE_DISCOVER_DONE_EVENT will notify when actions are
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  completed.
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if vendor-specific pre-discovery actions initialized
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  FALSE if no vendor-specific pre-discovery actions are needed.
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN HAL_NfcPreDiscover (void)
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN status = FALSE;
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
23645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    NFC_HDR *p_msg;
23745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
23845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    HAL_TRACE_API0 ("HAL_NfcPreDiscover ()");
23945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    if (nfc_hal_cb.pre_discover_done == FALSE)
24045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    {
24145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        nfc_hal_cb.pre_discover_done    = TRUE;
24245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        if (p_nfc_hal_pre_discover_cfg && *p_nfc_hal_pre_discover_cfg)
24345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        {
24445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu            status                          = TRUE;
24545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu            /* Send message to NFC_HAL_TASK */
24645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu            if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
24745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu            {
24845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                p_msg->event  = NFC_HAL_EVT_PRE_DISCOVER;
24945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
25045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu            }
25145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        }
25245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    }
25345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
2545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_API1 ("HAL_NfcPreDiscover status:%d", status);
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcControlGranted
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Grant control to HAL control for sending NCI commands.
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Call in response to HAL_REQUEST_CONTROL_EVENT.
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Must only be called when there are no NCI commands pending.
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  HAL_RELEASE_CONTROL_EVENT will notify when HAL no longer
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  needs control of NCI.
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcControlGranted (void)
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HDR *p_msg;
2785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_API0 ("HAL_NfcControlGranted ()");
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Send message to NFC_HAL_TASK */
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_msg->event  = NFC_HAL_EVT_CONTROL_GRANTED;
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcPowerCycle
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Restart NFCC by power cyle
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  HAL_OPEN_CPLT_EVT will notify when operation is complete.
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcPowerCycle (void)
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
3015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_API0 ("HAL_NfcPowerCycle ()");
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Only handle if HAL is opened (stack cback is not-NULL) */
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.p_stack_cback)
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Send power cycle event to NFC_HAL_TASK */
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_POWER_CYCLE);
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
311d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu/*******************************************************************************
312d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu**
313d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** Function         HAL_NfcGetMaxNfcee
314d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu**
315d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** Description      Retrieve the maximum number of NFCEEs supported by NFCC
316d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu**
317d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** Returns          the maximum number of NFCEEs supported by NFCC
318d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu**
319d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu*******************************************************************************/
320d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan ChuUINT8 HAL_NfcGetMaxNfcee (void)
321d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu{
322d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu    HAL_TRACE_API1 ("HAL_NfcGetMaxNfcee: %d",nfc_hal_cb.max_ee);
323d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu    return nfc_hal_cb.max_ee;
324d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu}
325d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
327