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