nfc_hal_api.c revision 5c65c3a0f42e174e47fecd4e569606003217ff4e
1/******************************************************************************
2 *
3 *  Copyright (C) 2012-2013 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 *  NFC Hardware Abstraction Layer API: Implementation for Broadcom NFC
23 *  controllers
24 *
25 ******************************************************************************/
26#include <string.h>
27#include "gki.h"
28#include "nfc_hal_target.h"
29#include "nfc_hal_api.h"
30#include "nfc_hal_int.h"
31
32/*******************************************************************************
33** NFC_HAL_TASK declarations
34*******************************************************************************/
35#define NFC_HAL_TASK_STR            ((INT8 *) "NFC_HAL_TASK")
36#define NFC_HAL_TASK_STACK_SIZE     0x400
37UINT32 nfc_hal_task_stack[(NFC_HAL_TASK_STACK_SIZE+3)/4];
38
39/*******************************************************************************
40**
41** Function         HAL_NfcInitialize
42**
43** Description      Called when HAL library is loaded.
44**
45**                  Initialize GKI and start the HCIT task
46**
47** Returns          void
48**
49*******************************************************************************/
50void HAL_NfcInitialize (void)
51{
52    /* Initialize HAL control block */
53    nfc_hal_main_init ();
54
55   HAL_TRACE_API1 ("HAL_NfcInitialize (): NFC_HAL_TASK id=%i", NFC_HAL_TASK);
56
57
58#ifndef NFC_HAL_SHARED_GKI
59    /* Initialize GKI (not needed if using shared NFC/HAL GKI resources) */
60    GKI_init ();
61    GKI_enable ();
62#endif
63
64    /* Create the NCI transport task */
65    GKI_create_task ((TASKPTR)nfc_hal_main_task,
66                     NFC_HAL_TASK,
67                     NFC_HAL_TASK_STR,
68                     (UINT16 *) ((UINT8 *)nfc_hal_task_stack + NFC_HAL_TASK_STACK_SIZE),
69                     sizeof(nfc_hal_task_stack), NULL, NULL);
70
71#ifndef NFC_HAL_SHARED_GKI
72    /* Start GKI scheduler (not needed if using shared NFC/HAL GKI resources) */
73    GKI_run (0);
74#endif
75}
76
77/*******************************************************************************
78**
79** Function         HAL_NfcTerminate
80**
81** Description      Called to terminate NFC HAL
82**
83** Returns          void
84**
85*******************************************************************************/
86void HAL_NfcTerminate(void)
87{
88    HAL_TRACE_API0 ("HAL_NfcTerminate ()");
89}
90
91
92/*******************************************************************************
93**
94** Function         HAL_NfcOpen
95**
96** Description      Open transport and intialize the NFCC, and
97**                  Register callback for HAL event notifications,
98**
99**                  HAL_OPEN_CPLT_EVT will notify when operation is complete.
100**
101** Returns          void
102**
103*******************************************************************************/
104void HAL_NfcOpen (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK *p_data_cback)
105{
106    HAL_TRACE_API0 ("HAL_NfcOpen ()");
107
108    /* Only handle if HAL is not opened (stack cback is NULL) */
109    if (p_hal_cback)
110    {
111        nfc_hal_dm_init ();
112        nfc_hal_cb.p_stack_cback = p_hal_cback;
113        nfc_hal_cb.p_data_cback  = p_data_cback;
114
115        /* Send startup event to NFC_HAL_TASK */
116        GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_INITIALIZE);
117    }
118}
119
120/*******************************************************************************
121**
122** Function         HAL_NfcClose
123**
124** Description      Prepare for shutdown. A HAL_CLOSE_DONE_EVENT will be
125**                  reported when complete.
126**
127** Returns          void
128**
129*******************************************************************************/
130void HAL_NfcClose (void)
131{
132    HAL_TRACE_API0 ("HAL_NfcClose ()");
133
134    /* Only handle if HAL is opened (stack cback is not-NULL) */
135    if (nfc_hal_cb.p_stack_cback)
136    {
137        /* Send shutdown event to NFC_HAL_TASK */
138        GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_TERMINATE);
139    }
140}
141
142/*******************************************************************************
143**
144** Function         HAL_NfcCoreInitialized
145**
146** Description      Called after the CORE_INIT_RSP is received from the NFCC.
147**                  At this time, the HAL can do any chip-specific configuration,
148**                  and when finished signal the libnfc-nci with event
149**                  HAL_POST_INIT_DONE.
150**
151** Returns          void
152**
153*******************************************************************************/
154void HAL_NfcCoreInitialized (UINT8 *p_core_init_rsp_params)
155{
156    NFC_HDR *p_msg;
157    UINT16  size;
158
159    HAL_TRACE_API0 ("HAL_NfcCoreInitialized ()");
160
161    /* NCI payload len + NCI header size */
162    size = p_core_init_rsp_params[2] + NCI_MSG_HDR_SIZE;
163
164    /* Send message to NFC_HAL_TASK */
165    if ((p_msg = (NFC_HDR *)GKI_getbuf ((UINT16)(size + NFC_HDR_SIZE))) != NULL)
166    {
167        p_msg->event  = NFC_HAL_EVT_POST_CORE_RESET;
168        p_msg->offset = 0;
169        p_msg->len    = size;
170        p_msg->layer_specific = 0;
171        memcpy ((UINT8 *)(p_msg + 1) + p_msg->offset, p_core_init_rsp_params, size);
172
173        GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
174    }
175}
176
177/*******************************************************************************
178**
179** Function         HAL_NfcWrite
180**
181** Description      Send an NCI control message or data packet to the
182**                  transport. If an NCI command message exceeds the transport
183**                  size, HAL is responsible for fragmenting it, Data packets
184**                  must be of the correct size.
185**
186** Returns          void
187**
188*******************************************************************************/
189void HAL_NfcWrite (UINT16 data_len, UINT8 *p_data)
190{
191    NFC_HDR *p_msg;
192    UINT8 mt;
193
194    HAL_TRACE_API0 ("HAL_NfcWrite ()");
195
196    if (data_len > (NCI_MAX_CTRL_SIZE + NCI_MSG_HDR_SIZE))
197    {
198        HAL_TRACE_ERROR1 ("HAL_NfcWrite (): too many bytes (%d)", data_len);
199        return;
200    }
201
202    /* Send message to NFC_HAL_TASK */
203    if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
204    {
205        p_msg->event  = NFC_HAL_EVT_TO_NFC_NCI;
206        p_msg->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE;
207        p_msg->len    = data_len;
208        memcpy ((UINT8 *)(p_msg+1) + p_msg->offset, p_data, data_len);
209
210        /* Check if message is a command or data */
211        mt = (*(p_data) & NCI_MT_MASK) >> NCI_MT_SHIFT;
212        p_msg->layer_specific = (mt == NCI_MT_CMD) ? NFC_HAL_WAIT_RSP_CMD : 0;
213
214
215        GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
216    }
217}
218
219/*******************************************************************************
220**
221** Function         HAL_NfcPreDiscover
222**
223** Description      Perform any vendor-specific pre-discovery actions (if needed)
224**                  If any actions were performed TRUE will be returned, and
225**                  HAL_PRE_DISCOVER_DONE_EVENT will notify when actions are
226**                  completed.
227**
228** Returns          TRUE if vendor-specific pre-discovery actions initialized
229**                  FALSE if no vendor-specific pre-discovery actions are needed.
230**
231*******************************************************************************/
232BOOLEAN HAL_NfcPreDiscover (void)
233{
234    BOOLEAN status = FALSE;
235
236    HAL_TRACE_API1 ("HAL_NfcPreDiscover status:%d", status);
237    return status;
238}
239
240/*******************************************************************************
241**
242** Function         HAL_NfcControlGranted
243**
244** Description      Grant control to HAL control for sending NCI commands.
245**
246**                  Call in response to HAL_REQUEST_CONTROL_EVENT.
247**
248**                  Must only be called when there are no NCI commands pending.
249**
250**                  HAL_RELEASE_CONTROL_EVENT will notify when HAL no longer
251**                  needs control of NCI.
252**
253**
254** Returns          void
255**
256*******************************************************************************/
257void HAL_NfcControlGranted (void)
258{
259    NFC_HDR *p_msg;
260    HAL_TRACE_API0 ("HAL_NfcControlGranted ()");
261
262    /* Send message to NFC_HAL_TASK */
263    if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
264    {
265        p_msg->event  = NFC_HAL_EVT_CONTROL_GRANTED;
266        GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
267    }
268}
269
270/*******************************************************************************
271**
272** Function         HAL_NfcPowerCycle
273**
274** Description      Restart NFCC by power cyle
275**
276**                  HAL_OPEN_CPLT_EVT will notify when operation is complete.
277**
278** Returns          void
279**
280*******************************************************************************/
281void HAL_NfcPowerCycle (void)
282{
283    HAL_TRACE_API0 ("HAL_NfcPowerCycle ()");
284
285    /* Only handle if HAL is opened (stack cback is not-NULL) */
286    if (nfc_hal_cb.p_stack_cback)
287    {
288        /* Send power cycle event to NFC_HAL_TASK */
289        GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_POWER_CYCLE);
290    }
291}
292
293
294