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