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
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
495