blob: 5180dcdd16514457821082d6f6ad98b62fa221ce [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
2 *
3 * Copyright (C) 1999-2012 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#ifndef GKI_H
19#define GKI_H
20
21
22/* Include platform-specific over-rides */
23#if (defined(NFC_STANDALONE) && (NFC_STANDALONE == TRUE))
24 #include "gki_target.h"
25#else
26 /* For non-nfc_standalone, include Bluetooth definitions */
27 #include "bt_target.h"
28#endif
29
30
31
32#include "bt_types.h"
33
34/* Error codes */
35#define GKI_SUCCESS 0x00
36#define GKI_FAILURE 0x01
37#define GKI_INVALID_TASK 0xF0
38#define GKI_INVALID_POOL 0xFF
39
40
41/************************************************************************
42** Mailbox definitions. Each task has 4 mailboxes that are used to
43** send buffers to the task.
44*/
45#define TASK_MBOX_0 0
46#define TASK_MBOX_1 1
47#define TASK_MBOX_2 2
48#define TASK_MBOX_3 3
49
50#define NUM_TASK_MBOX 4
51
52/************************************************************************
53** Event definitions.
54**
55** There are 4 reserved events used to signal messages rcvd in task mailboxes.
56** There are 4 reserved events used to signal timeout events.
57** There are 8 general purpose events available for applications.
58*/
59#define MAX_EVENTS 16
60
61#define TASK_MBOX_0_EVT_MASK 0x0001
62#define TASK_MBOX_1_EVT_MASK 0x0002
63#define TASK_MBOX_2_EVT_MASK 0x0004
64#define TASK_MBOX_3_EVT_MASK 0x0008
65
66
67#define TIMER_0 0
68#define TIMER_1 1
69#define TIMER_2 2
70#define TIMER_3 3
71
72#define TIMER_0_EVT_MASK 0x0010
73#define TIMER_1_EVT_MASK 0x0020
74#define TIMER_2_EVT_MASK 0x0040
75#define TIMER_3_EVT_MASK 0x0080
76
77#define APPL_EVT_0 8
78#define APPL_EVT_1 9
79#define APPL_EVT_2 10
80#define APPL_EVT_3 11
81#define APPL_EVT_4 12
82#define APPL_EVT_5 13
83#define APPL_EVT_6 14
84#define APPL_EVT_7 15
85
86#define EVENT_MASK(evt) ((UINT16)(0x0001 << (evt)))
87
88/************************************************************************
89** Max Time Queue
90**/
91#ifndef GKI_MAX_TIMER_QUEUES
92#define GKI_MAX_TIMER_QUEUES 3
93#endif
94
95/************************************************************************
96** Macro to determine the pool buffer size based on the GKI POOL ID at compile time.
97** Pool IDs index from 0 to GKI_NUM_FIXED_BUF_POOLS - 1
98*/
99
100#if (GKI_NUM_FIXED_BUF_POOLS < 1)
101
102#ifndef GKI_POOL_ID_0
103#define GKI_POOL_ID_0 0
104#endif /* ifndef GKI_POOL_ID_0 */
105
106#ifndef GKI_BUF0_SIZE
107#define GKI_BUF0_SIZE 0
108#endif /* ifndef GKI_BUF0_SIZE */
109
110#endif /* GKI_NUM_FIXED_BUF_POOLS < 1 */
111
112
113#if (GKI_NUM_FIXED_BUF_POOLS < 2)
114
115#ifndef GKI_POOL_ID_1
116#define GKI_POOL_ID_1 0
117#endif /* ifndef GKI_POOL_ID_1 */
118
119#ifndef GKI_BUF1_SIZE
120#define GKI_BUF1_SIZE 0
121#endif /* ifndef GKI_BUF1_SIZE */
122
123#endif /* GKI_NUM_FIXED_BUF_POOLS < 2 */
124
125
126#if (GKI_NUM_FIXED_BUF_POOLS < 3)
127
128#ifndef GKI_POOL_ID_2
129#define GKI_POOL_ID_2 0
130#endif /* ifndef GKI_POOL_ID_2 */
131
132#ifndef GKI_BUF2_SIZE
133#define GKI_BUF2_SIZE 0
134#endif /* ifndef GKI_BUF2_SIZE */
135
136#endif /* GKI_NUM_FIXED_BUF_POOLS < 3 */
137
138
139#if (GKI_NUM_FIXED_BUF_POOLS < 4)
140
141#ifndef GKI_POOL_ID_3
142#define GKI_POOL_ID_3 0
143#endif /* ifndef GKI_POOL_ID_4 */
144
145#ifndef GKI_BUF3_SIZE
146#define GKI_BUF3_SIZE 0
147#endif /* ifndef GKI_BUF3_SIZE */
148
149#endif /* GKI_NUM_FIXED_BUF_POOLS < 4 */
150
151
152#if (GKI_NUM_FIXED_BUF_POOLS < 5)
153
154#ifndef GKI_POOL_ID_4
155#define GKI_POOL_ID_4 0
156#endif /* ifndef GKI_POOL_ID_4 */
157
158#ifndef GKI_BUF4_SIZE
159#define GKI_BUF4_SIZE 0
160#endif /* ifndef GKI_BUF4_SIZE */
161
162#endif /* GKI_NUM_FIXED_BUF_POOLS < 5 */
163
164
165#if (GKI_NUM_FIXED_BUF_POOLS < 6)
166
167#ifndef GKI_POOL_ID_5
168#define GKI_POOL_ID_5 0
169#endif /* ifndef GKI_POOL_ID_5 */
170
171#ifndef GKI_BUF5_SIZE
172#define GKI_BUF5_SIZE 0
173#endif /* ifndef GKI_BUF5_SIZE */
174
175#endif /* GKI_NUM_FIXED_BUF_POOLS < 6 */
176
177
178#if (GKI_NUM_FIXED_BUF_POOLS < 7)
179
180#ifndef GKI_POOL_ID_6
181#define GKI_POOL_ID_6 0
182#endif /* ifndef GKI_POOL_ID_6 */
183
184#ifndef GKI_BUF6_SIZE
185#define GKI_BUF6_SIZE 0
186#endif /* ifndef GKI_BUF6_SIZE */
187
188#endif /* GKI_NUM_FIXED_BUF_POOLS < 7 */
189
190
191#if (GKI_NUM_FIXED_BUF_POOLS < 8)
192
193#ifndef GKI_POOL_ID_7
194#define GKI_POOL_ID_7 0
195#endif /* ifndef GKI_POOL_ID_7 */
196
197#ifndef GKI_BUF7_SIZE
198#define GKI_BUF7_SIZE 0
199#endif /* ifndef GKI_BUF7_SIZE */
200
201#endif /* GKI_NUM_FIXED_BUF_POOLS < 8 */
202
203
204#if (GKI_NUM_FIXED_BUF_POOLS < 9)
205
206#ifndef GKI_POOL_ID_8
207#define GKI_POOL_ID_8 0
208#endif /* ifndef GKI_POOL_ID_8 */
209
210#ifndef GKI_BUF8_SIZE
211#define GKI_BUF8_SIZE 0
212#endif /* ifndef GKI_BUF8_SIZE */
213
214#endif /* GKI_NUM_FIXED_BUF_POOLS < 9 */
215
216
217#if (GKI_NUM_FIXED_BUF_POOLS < 10)
218
219#ifndef GKI_POOL_ID_9
220#define GKI_POOL_ID_9 0
221#endif /* ifndef GKI_POOL_ID_9 */
222
223#ifndef GKI_BUF9_SIZE
224#define GKI_BUF9_SIZE 0
225#endif /* ifndef GKI_BUF9_SIZE */
226
227#endif /* GKI_NUM_FIXED_BUF_POOLS < 10 */
228
229
230#if (GKI_NUM_FIXED_BUF_POOLS < 11)
231
232#ifndef GKI_POOL_ID_10
233#define GKI_POOL_ID_10 0
234#endif /* ifndef GKI_POOL_ID_10 */
235
236#ifndef GKI_BUF10_SIZE
237#define GKI_BUF10_SIZE 0
238#endif /* ifndef GKI_BUF10_SIZE */
239
240#endif /* GKI_NUM_FIXED_BUF_POOLS < 11 */
241
242
243#if (GKI_NUM_FIXED_BUF_POOLS < 12)
244
245#ifndef GKI_POOL_ID_11
246#define GKI_POOL_ID_11 0
247#endif /* ifndef GKI_POOL_ID_11 */
248
249#ifndef GKI_BUF11_SIZE
250#define GKI_BUF11_SIZE 0
251#endif /* ifndef GKI_BUF11_SIZE */
252
253#endif /* GKI_NUM_FIXED_BUF_POOLS < 12 */
254
255
256#if (GKI_NUM_FIXED_BUF_POOLS < 13)
257
258#ifndef GKI_POOL_ID_12
259#define GKI_POOL_ID_12 0
260#endif /* ifndef GKI_POOL_ID_12 */
261
262#ifndef GKI_BUF12_SIZE
263#define GKI_BUF12_SIZE 0
264#endif /* ifndef GKI_BUF12_SIZE */
265
266#endif /* GKI_NUM_FIXED_BUF_POOLS < 13 */
267
268
269#if (GKI_NUM_FIXED_BUF_POOLS < 14)
270
271#ifndef GKI_POOL_ID_13
272#define GKI_POOL_ID_13 0
273#endif /* ifndef GKI_POOL_ID_13 */
274
275#ifndef GKI_BUF13_SIZE
276#define GKI_BUF13_SIZE 0
277#endif /* ifndef GKI_BUF13_SIZE */
278
279#endif /* GKI_NUM_FIXED_BUF_POOLS < 14 */
280
281
282#if (GKI_NUM_FIXED_BUF_POOLS < 15)
283
284#ifndef GKI_POOL_ID_14
285#define GKI_POOL_ID_14 0
286#endif /* ifndef GKI_POOL_ID_14 */
287
288#ifndef GKI_BUF14_SIZE
289#define GKI_BUF14_SIZE 0
290#endif /* ifndef GKI_BUF14_SIZE */
291
292#endif /* GKI_NUM_FIXED_BUF_POOLS < 15 */
293
294
295#if (GKI_NUM_FIXED_BUF_POOLS < 16)
296
297#ifndef GKI_POOL_ID_15
298#define GKI_POOL_ID_15 0
299#endif /* ifndef GKI_POOL_ID_15 */
300
301#ifndef GKI_BUF15_SIZE
302#define GKI_BUF15_SIZE 0
303#endif /* ifndef GKI_BUF15_SIZE */
304
305#endif /* GKI_NUM_FIXED_BUF_POOLS < 16 */
306
307
308/* Timer list entry callback type
309*/
310typedef void (TIMER_CBACK)(void *p_tle);
311#ifndef TIMER_PARAM_TYPE
312#ifdef WIN2000
313#define TIMER_PARAM_TYPE void *
314#else
315#define TIMER_PARAM_TYPE UINT32
316#endif
317#endif
318/* Define a timer list entry
319*/
320typedef struct _tle
321{
322 struct _tle *p_next;
323 struct _tle *p_prev;
324 TIMER_CBACK *p_cback;
325 INT32 ticks;
326 TIMER_PARAM_TYPE param;
327 UINT16 event;
328 UINT8 in_use;
329} TIMER_LIST_ENT;
330
331/* Define a timer list queue
332*/
333typedef struct
334{
335 TIMER_LIST_ENT *p_first;
336 TIMER_LIST_ENT *p_last;
337 INT32 last_ticks;
338} TIMER_LIST_Q;
339
340
341/***********************************************************************
342** This queue is a general purpose buffer queue, for application use.
343*/
344typedef struct
345{
346 void *p_first;
347 void *p_last;
348 UINT16 count;
349} BUFFER_Q;
350
351#define GKI_IS_QUEUE_EMPTY(p_q) ((p_q)->count == 0)
352
353/* Task constants
354*/
355#ifndef TASKPTR
356typedef void (*TASKPTR)(UINT32);
357#endif
358
359
360#define GKI_PUBLIC_POOL 0 /* General pool accessible to GKI_getbuf() */
361#define GKI_RESTRICTED_POOL 1 /* Inaccessible pool to GKI_getbuf() */
362
363/***********************************************************************
364** Function prototypes
365*/
366
367#ifdef __cplusplus
368extern "C" {
369#endif
370
371/* Task management
372*/
373GKI_API extern UINT8 GKI_create_task (TASKPTR, UINT8, INT8 *, UINT16 *, UINT16);
374GKI_API extern void GKI_destroy_task(UINT8 task_id);
375GKI_API extern void GKI_task_self_cleanup(UINT8 task_id);
376GKI_API extern void GKI_exit_task(UINT8);
377GKI_API extern UINT8 GKI_get_taskid(void);
378GKI_API extern void GKI_init(void);
379GKI_API extern void GKI_shutdown(void);
380GKI_API extern INT8 *GKI_map_taskname(UINT8);
381GKI_API extern UINT8 GKI_resume_task(UINT8);
382GKI_API extern void GKI_run(void *);
383GKI_API extern void GKI_freeze(void);
384GKI_API extern void GKI_stop(void);
385GKI_API extern UINT8 GKI_suspend_task(UINT8);
386GKI_API extern UINT8 GKI_is_task_running(UINT8);
387
388/* memory management
389*/
390GKI_API extern void GKI_shiftdown (UINT8 *p_mem, UINT32 len, UINT32 shift_amount);
391GKI_API extern void GKI_shiftup (UINT8 *p_dest, UINT8 *p_src, UINT32 len);
392
393/* To send buffers and events between tasks
394*/
395GKI_API extern UINT8 GKI_isend_event (UINT8, UINT16);
396GKI_API extern void GKI_isend_msg (UINT8, UINT8, void *);
397GKI_API extern void *GKI_read_mbox (UINT8);
398GKI_API extern void GKI_send_msg (UINT8, UINT8, void *);
399GKI_API extern UINT8 GKI_send_event (UINT8, UINT16);
400
401
402/* To get and release buffers, change owner and get size
403*/
404GKI_API extern void GKI_change_buf_owner (void *, UINT8);
405GKI_API extern UINT8 GKI_create_pool (UINT16, UINT16, UINT8, void *);
406GKI_API extern void GKI_delete_pool (UINT8);
407GKI_API extern void *GKI_find_buf_start (void *);
408GKI_API extern void GKI_freebuf (void *);
409GKI_API extern void *GKI_getbuf (UINT16);
410GKI_API extern UINT16 GKI_get_buf_size (void *);
411GKI_API extern void *GKI_getpoolbuf (UINT8);
412GKI_API extern UINT16 GKI_poolcount (UINT8);
413GKI_API extern UINT16 GKI_poolfreecount (UINT8);
414GKI_API extern UINT16 GKI_poolutilization (UINT8);
415GKI_API extern void GKI_register_mempool (void *p_mem);
416GKI_API extern UINT8 GKI_set_pool_permission(UINT8, UINT8);
417
418
419/* User buffer queue management
420*/
421GKI_API extern void *GKI_dequeue (BUFFER_Q *);
422GKI_API extern void GKI_enqueue (BUFFER_Q *, void *);
423GKI_API extern void GKI_enqueue_head (BUFFER_Q *, void *);
424GKI_API extern void *GKI_getfirst (BUFFER_Q *);
425GKI_API extern void *GKI_getlast (BUFFER_Q *);
426GKI_API extern void *GKI_getnext (void *);
427GKI_API extern void GKI_init_q (BUFFER_Q *);
428GKI_API extern BOOLEAN GKI_queue_is_empty(BUFFER_Q *);
429GKI_API extern void *GKI_remove_from_queue (BUFFER_Q *, void *);
430GKI_API extern UINT16 GKI_get_pool_bufsize (UINT8);
431
432/* Timer management
433*/
434GKI_API extern void GKI_add_to_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT *);
435GKI_API extern void GKI_delay(UINT32);
436GKI_API extern UINT32 GKI_get_tick_count(void);
437GKI_API extern INT8 *GKI_get_time_stamp(INT8 *);
438GKI_API extern void GKI_init_timer_list (TIMER_LIST_Q *);
439GKI_API extern void GKI_init_timer_list_entry (TIMER_LIST_ENT *);
440GKI_API extern INT32 GKI_ready_to_sleep (void);
441GKI_API extern void GKI_remove_from_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT *);
442GKI_API extern void GKI_start_timer(UINT8, INT32, BOOLEAN);
443GKI_API extern void GKI_stop_timer (UINT8);
444GKI_API extern void GKI_timer_update(INT32);
445GKI_API extern UINT16 GKI_update_timer_list (TIMER_LIST_Q *, INT32);
446GKI_API extern UINT32 GKI_get_remaining_ticks (TIMER_LIST_Q *, TIMER_LIST_ENT *);
447GKI_API extern UINT16 GKI_wait(UINT16, UINT32);
448
449/* Start and Stop system time tick callback
450 * true for start system tick if time queue is not empty
451 * false to stop system tick if time queue is empty
452*/
453typedef void (SYSTEM_TICK_CBACK)(BOOLEAN);
454
455/* Time queue management for system ticks
456*/
457GKI_API extern BOOLEAN GKI_timer_queue_empty (void);
458GKI_API extern void GKI_timer_queue_register_callback(SYSTEM_TICK_CBACK *);
459
460/* Disable Interrupts, Enable Interrupts
461*/
462GKI_API extern void GKI_enable(void);
463GKI_API extern void GKI_disable(void);
464GKI_API extern void GKI_sched_lock(void);
465GKI_API extern void GKI_sched_unlock(void);
466
467/* Allocate (Free) memory from an OS
468*/
469GKI_API extern void *GKI_os_malloc (UINT32);
470GKI_API extern void GKI_os_free (void *);
471
472/* os timer operation */
473GKI_API extern UINT32 GKI_get_os_tick_count(void);
474
475/* Exception handling
476*/
477GKI_API extern void GKI_exception (UINT16, char *);
478
479#if GKI_DEBUG == TRUE
480GKI_API extern void GKI_PrintBufferUsage(UINT8 *p_num_pools, UINT16 *p_cur_used);
481GKI_API extern void GKI_PrintBuffer(void);
482GKI_API extern void GKI_print_task(void);
483#else
484#undef GKI_PrintBufferUsage
485#define GKI_PrintBuffer() NULL
486#endif
487
488#ifdef __cplusplus
489}
490#endif
491
492
493#endif
494